profile_signin_confirmation_dialog_views.cc revision 868fa2fe829687343ffae624259930155e16dbd8
144d362409d5469aed47d19e7908d19bd194493aThomas Graf// Copyright 2013 The Chromium Authors. All rights reserved. 244d362409d5469aed47d19e7908d19bd194493aThomas Graf// Use of this source code is governed by a BSD-style license that can be 344d362409d5469aed47d19e7908d19bd194493aThomas Graf// found in the LICENSE file. 444d362409d5469aed47d19e7908d19bd194493aThomas Graf 544d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h" 644d362409d5469aed47d19e7908d19bd194493aThomas Graf 744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "base/strings/utf_string_conversions.h" 844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "chrome/browser/ui/browser.h" 9535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf#include "chrome/browser/ui/browser_dialogs.h" 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "chrome/browser/ui/browser_navigator.h" 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "chrome/browser/ui/browser_window.h" 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "chrome/browser/ui/host_desktop.h" 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "chrome/browser/ui/views/constrained_window_views.h" 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "components/web_modal/web_contents_modal_dialog_manager.h" 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "content/public/browser/web_contents.h" 1744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "content/public/browser/web_contents_view.h" 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "google_apis/gaia/gaia_auth_util.h" 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "grit/chromium_strings.h" 2044d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "grit/generated_resources.h" 2144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "third_party/skia/include/core/SkColor.h" 2244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/base/l10n/l10n_util.h" 2344d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/base/range/range.h" 2444d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/gfx/font.h" 252bdee95a765457fe4206b89d51974ae56e75c588Thomas Graf#include "ui/gfx/native_widget_types.h" 2644d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/views/background.h" 2744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/views/controls/label.h" 2844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/views/controls/link.h" 2944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/views/controls/styled_label.h" 301155370f520cb64657e25153255cf7dc1424317fThomas Graf#include "ui/views/layout/box_layout.h" 3144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/views/layout/grid_layout.h" 3244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/views/layout/layout_constants.h" 3344d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "ui/views/widget/widget.h" 3444d362409d5469aed47d19e7908d19bd194493aThomas Graf 3544d362409d5469aed47d19e7908d19bd194493aThomas Grafnamespace { 3644d362409d5469aed47d19e7908d19bd194493aThomas Graf 3744d362409d5469aed47d19e7908d19bd194493aThomas Graf// Wrap a view in a fixed-width container. 3844d362409d5469aed47d19e7908d19bd194493aThomas Grafviews::View* MakeFixedWidth(views::View* view, int width) { 3944d362409d5469aed47d19e7908d19bd194493aThomas Graf views::View* container = new views::View; 4044d362409d5469aed47d19e7908d19bd194493aThomas Graf views::GridLayout* layout = views::GridLayout::CreatePanel(container); 4144d362409d5469aed47d19e7908d19bd194493aThomas Graf container->SetLayoutManager(layout); 4244d362409d5469aed47d19e7908d19bd194493aThomas Graf layout->AddColumnSet(0)->AddColumn( 431155370f520cb64657e25153255cf7dc1424317fThomas Graf views::GridLayout::LEADING, views::GridLayout::CENTER, 0, 4444d362409d5469aed47d19e7908d19bd194493aThomas Graf views::GridLayout::FIXED, width, false); 4544d362409d5469aed47d19e7908d19bd194493aThomas Graf layout->StartRow(0, 0); 4644d362409d5469aed47d19e7908d19bd194493aThomas Graf layout->AddView(view, 1, 1, views::GridLayout::FILL, views::GridLayout::FILL); 4744d362409d5469aed47d19e7908d19bd194493aThomas Graf return container; 481155370f520cb64657e25153255cf7dc1424317fThomas Graf} 4944d362409d5469aed47d19e7908d19bd194493aThomas Graf 5044d362409d5469aed47d19e7908d19bd194493aThomas Graf} // namespace 5144d362409d5469aed47d19e7908d19bd194493aThomas Graf 5244d362409d5469aed47d19e7908d19bd194493aThomas Grafnamespace chrome { 5344d362409d5469aed47d19e7908d19bd194493aThomas Graf// Declared in browser_dialogs.h 5444d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ShowProfileSigninConfirmationDialog( 551155370f520cb64657e25153255cf7dc1424317fThomas Graf Browser* browser, 5644d362409d5469aed47d19e7908d19bd194493aThomas Graf content::WebContents* web_contents, 5744d362409d5469aed47d19e7908d19bd194493aThomas Graf Profile* profile, 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf const std::string& username, 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::ProfileSigninConfirmationDelegate* delegate) { 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf ProfileSigninConfirmationDialogViews::ShowDialog(browser, 611155370f520cb64657e25153255cf7dc1424317fThomas Graf profile, 6244d362409d5469aed47d19e7908d19bd194493aThomas Graf username, 631155370f520cb64657e25153255cf7dc1424317fThomas Graf delegate); 641155370f520cb64657e25153255cf7dc1424317fThomas Graf} 651155370f520cb64657e25153255cf7dc1424317fThomas Graf} // namespace chrome 661155370f520cb64657e25153255cf7dc1424317fThomas Graf 671155370f520cb64657e25153255cf7dc1424317fThomas GrafProfileSigninConfirmationDialogViews::ProfileSigninConfirmationDialogViews( 681155370f520cb64657e25153255cf7dc1424317fThomas Graf Browser* browser, 691155370f520cb64657e25153255cf7dc1424317fThomas Graf Profile* profile, 701155370f520cb64657e25153255cf7dc1424317fThomas Graf const std::string& username, 7144d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::ProfileSigninConfirmationDelegate* delegate) 7244d362409d5469aed47d19e7908d19bd194493aThomas Graf : browser_(browser), 7344d362409d5469aed47d19e7908d19bd194493aThomas Graf profile_(profile), 7444d362409d5469aed47d19e7908d19bd194493aThomas Graf username_(username), 7544d362409d5469aed47d19e7908d19bd194493aThomas Graf delegate_(delegate), 7644d362409d5469aed47d19e7908d19bd194493aThomas Graf prompt_for_new_profile_(true), 7744d362409d5469aed47d19e7908d19bd194493aThomas Graf link_(NULL) { 7844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 7944d362409d5469aed47d19e7908d19bd194493aThomas Graf 8044d362409d5469aed47d19e7908d19bd194493aThomas GrafProfileSigninConfirmationDialogViews::~ProfileSigninConfirmationDialogViews() {} 8144d362409d5469aed47d19e7908d19bd194493aThomas Graf 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf// static 8344d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ProfileSigninConfirmationDialogViews::ShowDialog( 8444d362409d5469aed47d19e7908d19bd194493aThomas Graf Browser* browser, 8544d362409d5469aed47d19e7908d19bd194493aThomas Graf Profile* profile, 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf const std::string& username, 8744d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::ProfileSigninConfirmationDelegate* delegate) { 8844d362409d5469aed47d19e7908d19bd194493aThomas Graf ProfileSigninConfirmationDialogViews* dialog = 8944d362409d5469aed47d19e7908d19bd194493aThomas Graf new ProfileSigninConfirmationDialogViews( 9044d362409d5469aed47d19e7908d19bd194493aThomas Graf browser, profile, username, delegate); 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::CheckShouldPromptForNewProfile( 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf profile, 931155370f520cb64657e25153255cf7dc1424317fThomas Graf // This callback is guaranteed to be invoked, and once it is, the dialog 9444d362409d5469aed47d19e7908d19bd194493aThomas Graf // owns itself. 9544d362409d5469aed47d19e7908d19bd194493aThomas Graf base::Bind(&ProfileSigninConfirmationDialogViews::Show, 9644d362409d5469aed47d19e7908d19bd194493aThomas Graf base::Unretained(dialog))); 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf 99535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Grafvoid ProfileSigninConfirmationDialogViews::Show(bool prompt_for_new_profile) { 10044d362409d5469aed47d19e7908d19bd194493aThomas Graf prompt_for_new_profile_ = prompt_for_new_profile; 10144d362409d5469aed47d19e7908d19bd194493aThomas Graf CreateDialogWidget(this, NULL, browser_->window()->GetNativeWindow())->Show(); 10244d362409d5469aed47d19e7908d19bd194493aThomas Graf} 10344d362409d5469aed47d19e7908d19bd194493aThomas Graf 10444d362409d5469aed47d19e7908d19bd194493aThomas Grafstring16 ProfileSigninConfirmationDialogViews::GetWindowTitle() const { 10544d362409d5469aed47d19e7908d19bd194493aThomas Graf return l10n_util::GetStringUTF16( 10644d362409d5469aed47d19e7908d19bd194493aThomas Graf IDS_ENTERPRISE_SIGNIN_TITLE_NEW_STYLE); 10744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 10844d362409d5469aed47d19e7908d19bd194493aThomas Graf 10944d362409d5469aed47d19e7908d19bd194493aThomas Grafstring16 ProfileSigninConfirmationDialogViews::GetDialogButtonLabel( 11044d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::DialogButton button) const { 11144d362409d5469aed47d19e7908d19bd194493aThomas Graf return l10n_util::GetStringUTF16((button == ui::DIALOG_BUTTON_OK) ? 11244d362409d5469aed47d19e7908d19bd194493aThomas Graf IDS_ENTERPRISE_SIGNIN_CONTINUE_NEW_STYLE : 11344d362409d5469aed47d19e7908d19bd194493aThomas Graf IDS_ENTERPRISE_SIGNIN_CANCEL); 11444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 11544d362409d5469aed47d19e7908d19bd194493aThomas Graf 11644d362409d5469aed47d19e7908d19bd194493aThomas Grafint ProfileSigninConfirmationDialogViews::GetDefaultDialogButton() const { 11744d362409d5469aed47d19e7908d19bd194493aThomas Graf return ui::DIALOG_BUTTON_NONE; 11844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 11944d362409d5469aed47d19e7908d19bd194493aThomas Graf 12044d362409d5469aed47d19e7908d19bd194493aThomas Grafviews::View* ProfileSigninConfirmationDialogViews::CreateExtraView() { 12144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (prompt_for_new_profile_) { 12244d362409d5469aed47d19e7908d19bd194493aThomas Graf const string16 create_profile_text = 12344d362409d5469aed47d19e7908d19bd194493aThomas Graf l10n_util::GetStringUTF16( 12444d362409d5469aed47d19e7908d19bd194493aThomas Graf IDS_ENTERPRISE_SIGNIN_CREATE_NEW_PROFILE_NEW_STYLE); 12544d362409d5469aed47d19e7908d19bd194493aThomas Graf link_ = new views::Link(create_profile_text); 12644d362409d5469aed47d19e7908d19bd194493aThomas Graf link_->SetUnderline(false); 12744d362409d5469aed47d19e7908d19bd194493aThomas Graf link_->set_listener(this); 12844d362409d5469aed47d19e7908d19bd194493aThomas Graf link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 12944d362409d5469aed47d19e7908d19bd194493aThomas Graf } 13044d362409d5469aed47d19e7908d19bd194493aThomas Graf return link_; 13144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 1326de17f3308cfd53ad922d144a1b28ddd962d6678Thomas Graf 13323ee46ef7115c2e311c36e43a833e6c3deada18aThomas Grafbool ProfileSigninConfirmationDialogViews::Accept() { 13444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (delegate_) { 13544d362409d5469aed47d19e7908d19bd194493aThomas Graf delegate_->OnContinueSignin(); 13644d362409d5469aed47d19e7908d19bd194493aThomas Graf delegate_ = NULL; 13744d362409d5469aed47d19e7908d19bd194493aThomas Graf } 13844d362409d5469aed47d19e7908d19bd194493aThomas Graf return true; 13944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 14044d362409d5469aed47d19e7908d19bd194493aThomas Graf 14144d362409d5469aed47d19e7908d19bd194493aThomas Grafbool ProfileSigninConfirmationDialogViews::Cancel() { 14244d362409d5469aed47d19e7908d19bd194493aThomas Graf if (delegate_) { 14344d362409d5469aed47d19e7908d19bd194493aThomas Graf delegate_->OnCancelSignin(); 14444d362409d5469aed47d19e7908d19bd194493aThomas Graf delegate_ = NULL; 14544d362409d5469aed47d19e7908d19bd194493aThomas Graf } 14644d362409d5469aed47d19e7908d19bd194493aThomas Graf return true; 14744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 14844d362409d5469aed47d19e7908d19bd194493aThomas Graf 14944d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ProfileSigninConfirmationDialogViews::OnClose() { 15044d362409d5469aed47d19e7908d19bd194493aThomas Graf Cancel(); 15144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 15244d362409d5469aed47d19e7908d19bd194493aThomas Graf 15344d362409d5469aed47d19e7908d19bd194493aThomas Grafui::ModalType ProfileSigninConfirmationDialogViews::GetModalType() const { 15444d362409d5469aed47d19e7908d19bd194493aThomas Graf return ui::MODAL_TYPE_WINDOW; 15544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 15644d362409d5469aed47d19e7908d19bd194493aThomas Graf 15744d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ProfileSigninConfirmationDialogViews::ViewHierarchyChanged( 15844d362409d5469aed47d19e7908d19bd194493aThomas Graf const ViewHierarchyChangedDetails& details) { 15944d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!details.is_add || details.child != this) 16044d362409d5469aed47d19e7908d19bd194493aThomas Graf return; 16144d362409d5469aed47d19e7908d19bd194493aThomas Graf 16244d362409d5469aed47d19e7908d19bd194493aThomas Graf // Layout the labels in a single fixed-width column. 16344d362409d5469aed47d19e7908d19bd194493aThomas Graf SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); 16444d362409d5469aed47d19e7908d19bd194493aThomas Graf 16544d362409d5469aed47d19e7908d19bd194493aThomas Graf // Create the prompt label. 16644d362409d5469aed47d19e7908d19bd194493aThomas Graf std::vector<size_t> offsets; 16744d362409d5469aed47d19e7908d19bd194493aThomas Graf const string16 domain = ASCIIToUTF16(gaia::ExtractDomainName(username_)); 16844d362409d5469aed47d19e7908d19bd194493aThomas Graf const string16 username = ASCIIToUTF16(username_); 16944d362409d5469aed47d19e7908d19bd194493aThomas Graf const string16 prompt_text = 1703ad4665be2f192291238cbe78118a57ec42436c6Thomas Graf l10n_util::GetStringFUTF16( 1713ad4665be2f192291238cbe78118a57ec42436c6Thomas Graf IDS_ENTERPRISE_SIGNIN_ALERT_NEW_STYLE, 172a7469ce758fac3631df6ce72eb3f89150070e7f8Thomas Graf username, domain, &offsets); 173a7469ce758fac3631df6ce72eb3f89150070e7f8Thomas Graf views::StyledLabel* prompt_label = new views::StyledLabel(prompt_text, this); 174a7469ce758fac3631df6ce72eb3f89150070e7f8Thomas Graf views::StyledLabel::RangeStyleInfo bold_style; 17544d362409d5469aed47d19e7908d19bd194493aThomas Graf bold_style.font_style = gfx::Font::BOLD; 17644d362409d5469aed47d19e7908d19bd194493aThomas Graf prompt_label->AddStyleRange( 17744d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::Range(offsets[1], offsets[1] + domain.size()), bold_style); 17844d362409d5469aed47d19e7908d19bd194493aThomas Graf 17944d362409d5469aed47d19e7908d19bd194493aThomas Graf // Add the prompt label with a darker background and border. 18044d362409d5469aed47d19e7908d19bd194493aThomas Graf const int kDialogWidth = 440; 18144d362409d5469aed47d19e7908d19bd194493aThomas Graf views::View* prompt_container = MakeFixedWidth(prompt_label, kDialogWidth); 18244d362409d5469aed47d19e7908d19bd194493aThomas Graf prompt_container->set_border( 18344d362409d5469aed47d19e7908d19bd194493aThomas Graf views::Border::CreateSolidSidedBorder( 18444d362409d5469aed47d19e7908d19bd194493aThomas Graf 1, 0, 1, 0, 18544d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::GetSigninConfirmationPromptBarColor( 18644d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::kSigninConfirmationPromptBarBorderAlpha))); 18744d362409d5469aed47d19e7908d19bd194493aThomas Graf prompt_container->set_background( 18844d362409d5469aed47d19e7908d19bd194493aThomas Graf views::Background::CreateSolidBackground( 18944d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::GetSigninConfirmationPromptBarColor( 19044d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::kSigninConfirmationPromptBarBackgroundAlpha))); 19144d362409d5469aed47d19e7908d19bd194493aThomas Graf AddChildView(prompt_container); 19244d362409d5469aed47d19e7908d19bd194493aThomas Graf 19344d362409d5469aed47d19e7908d19bd194493aThomas Graf // Create and add the explanation label. 19444d362409d5469aed47d19e7908d19bd194493aThomas Graf offsets.clear(); 19544d362409d5469aed47d19e7908d19bd194493aThomas Graf const string16 learn_more_text = 19644d362409d5469aed47d19e7908d19bd194493aThomas Graf l10n_util::GetStringUTF16( 19744d362409d5469aed47d19e7908d19bd194493aThomas Graf IDS_ENTERPRISE_SIGNIN_PROFILE_LINK_LEARN_MORE); 19844d362409d5469aed47d19e7908d19bd194493aThomas Graf const string16 signin_explanation_text = 19944d362409d5469aed47d19e7908d19bd194493aThomas Graf l10n_util::GetStringFUTF16(prompt_for_new_profile_ ? 20044d362409d5469aed47d19e7908d19bd194493aThomas Graf IDS_ENTERPRISE_SIGNIN_EXPLANATION_WITH_PROFILE_CREATION_NEW_STYLE : 20144d362409d5469aed47d19e7908d19bd194493aThomas Graf IDS_ENTERPRISE_SIGNIN_EXPLANATION_WITHOUT_PROFILE_CREATION_NEW_STYLE, 20244d362409d5469aed47d19e7908d19bd194493aThomas Graf username, learn_more_text, &offsets); 20344d362409d5469aed47d19e7908d19bd194493aThomas Graf explanation_label_ = new views::StyledLabel(signin_explanation_text, this); 20444d362409d5469aed47d19e7908d19bd194493aThomas Graf views::StyledLabel::RangeStyleInfo link_style = 20544d362409d5469aed47d19e7908d19bd194493aThomas Graf views::StyledLabel::RangeStyleInfo::CreateForLink(); 20644d362409d5469aed47d19e7908d19bd194493aThomas Graf link_style.font_style = gfx::Font::NORMAL; 20744d362409d5469aed47d19e7908d19bd194493aThomas Graf explanation_label_->AddStyleRange( 20844d362409d5469aed47d19e7908d19bd194493aThomas Graf ui::Range(offsets[1], offsets[1] + learn_more_text.size()), 20944d362409d5469aed47d19e7908d19bd194493aThomas Graf link_style); 21044d362409d5469aed47d19e7908d19bd194493aThomas Graf // TODO(dconnelly): set the background color on the label (crbug.com/244630) 21144d362409d5469aed47d19e7908d19bd194493aThomas Graf AddChildView(MakeFixedWidth(explanation_label_, kDialogWidth)); 21244d362409d5469aed47d19e7908d19bd194493aThomas Graf} 21344d362409d5469aed47d19e7908d19bd194493aThomas Graf 21444d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ProfileSigninConfirmationDialogViews::LinkClicked(views::Link* source, 21544d362409d5469aed47d19e7908d19bd194493aThomas Graf int event_flags) { 21644d362409d5469aed47d19e7908d19bd194493aThomas Graf if (delegate_) { 21744d362409d5469aed47d19e7908d19bd194493aThomas Graf delegate_->OnSigninWithNewProfile(); 21844d362409d5469aed47d19e7908d19bd194493aThomas Graf delegate_ = NULL; 21944d362409d5469aed47d19e7908d19bd194493aThomas Graf } 22044d362409d5469aed47d19e7908d19bd194493aThomas Graf GetWidget()->Close(); 22144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 22244d362409d5469aed47d19e7908d19bd194493aThomas Graf 22344d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ProfileSigninConfirmationDialogViews::StyledLabelLinkClicked( 22444d362409d5469aed47d19e7908d19bd194493aThomas Graf const ui::Range& range, 22544d362409d5469aed47d19e7908d19bd194493aThomas Graf int event_flags) { 22644d362409d5469aed47d19e7908d19bd194493aThomas Graf chrome::NavigateParams params( 22744d362409d5469aed47d19e7908d19bd194493aThomas Graf browser_, 22844d362409d5469aed47d19e7908d19bd194493aThomas Graf GURL("http://support.google.com/chromeos/bin/answer.py?answer=1331549"), 22944d362409d5469aed47d19e7908d19bd194493aThomas Graf content::PAGE_TRANSITION_LINK); 23044d362409d5469aed47d19e7908d19bd194493aThomas Graf params.disposition = NEW_POPUP; 23144d362409d5469aed47d19e7908d19bd194493aThomas Graf params.window_action = chrome::NavigateParams::SHOW_WINDOW; 23244d362409d5469aed47d19e7908d19bd194493aThomas Graf chrome::Navigate(¶ms); 23344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 23444d362409d5469aed47d19e7908d19bd194493aThomas Graf