| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/chromeos/login/simple_web_view_dialog.h" | |
| 6 | |
| 7 #include "ash/shell.h" | |
| 8 #include "ash/shell_window_ids.h" | |
| 9 #include "base/message_loop/message_loop.h" | |
| 10 #include "base/strings/utf_string_conversions.h" | |
| 11 #include "chrome/app/chrome_command_ids.h" | |
| 12 #include "chrome/browser/chromeos/login/captive_portal_window_proxy.h" | |
| 13 #include "chrome/browser/chromeos/login/helper.h" | |
| 14 #include "chrome/browser/command_updater.h" | |
| 15 #include "chrome/browser/password_manager/chrome_password_manager_client.h" | |
| 16 #include "chrome/browser/profiles/profile.h" | |
| 17 #include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h" | |
| 18 #include "chrome/browser/ui/browser.h" | |
| 19 #include "chrome/browser/ui/content_settings/content_setting_bubble_model_delega
te.h" | |
| 20 #include "chrome/browser/ui/toolbar/toolbar_model_impl.h" | |
| 21 #include "chrome/browser/ui/view_ids.h" | |
| 22 #include "chrome/browser/ui/views/location_bar/location_icon_view.h" | |
| 23 #include "chrome/browser/ui/views/toolbar/reload_button.h" | |
| 24 #include "components/password_manager/core/browser/password_manager.h" | |
| 25 #include "content/public/browser/navigation_controller.h" | |
| 26 #include "content/public/browser/navigation_entry.h" | |
| 27 #include "content/public/browser/web_contents.h" | |
| 28 #include "grit/generated_resources.h" | |
| 29 #include "grit/theme_resources.h" | |
| 30 #include "ipc/ipc_message.h" | |
| 31 #include "ui/base/l10n/l10n_util.h" | |
| 32 #include "ui/base/theme_provider.h" | |
| 33 #include "ui/views/background.h" | |
| 34 #include "ui/views/controls/webview/webview.h" | |
| 35 #include "ui/views/layout/grid_layout.h" | |
| 36 #include "ui/views/layout/layout_constants.h" | |
| 37 #include "ui/views/view.h" | |
| 38 #include "ui/views/widget/widget.h" | |
| 39 | |
| 40 using content::WebContents; | |
| 41 using views::GridLayout; | |
| 42 | |
| 43 namespace { | |
| 44 | |
| 45 const int kLocationBarHeight = 35; | |
| 46 | |
| 47 // Margin between screen edge and SimpleWebViewDialog border. | |
| 48 const int kExternalMargin = 60; | |
| 49 | |
| 50 // Margin between WebView and SimpleWebViewDialog border. | |
| 51 const int kInnerMargin = 2; | |
| 52 | |
| 53 const SkColor kDialogColor = SK_ColorWHITE; | |
| 54 | |
| 55 class ToolbarRowView : public views::View { | |
| 56 public: | |
| 57 ToolbarRowView() { | |
| 58 set_background(views::Background::CreateSolidBackground(kDialogColor)); | |
| 59 } | |
| 60 | |
| 61 virtual ~ToolbarRowView() {} | |
| 62 | |
| 63 void Init(views::View* back, | |
| 64 views::View* forward, | |
| 65 views::View* reload, | |
| 66 views::View* location_bar) { | |
| 67 GridLayout* layout = new GridLayout(this); | |
| 68 SetLayoutManager(layout); | |
| 69 | |
| 70 // Back button. | |
| 71 views::ColumnSet* column_set = layout->AddColumnSet(0); | |
| 72 column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0, | |
| 73 GridLayout::USE_PREF, 0, 0); | |
| 74 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); | |
| 75 // Forward button. | |
| 76 column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0, | |
| 77 GridLayout::USE_PREF, 0, 0); | |
| 78 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); | |
| 79 // Reload button. | |
| 80 column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0, | |
| 81 GridLayout::USE_PREF, 0, 0); | |
| 82 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); | |
| 83 // Location bar. | |
| 84 column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, | |
| 85 GridLayout::FIXED, kLocationBarHeight, 0); | |
| 86 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); | |
| 87 | |
| 88 layout->StartRow(0, 0); | |
| 89 layout->AddView(back); | |
| 90 layout->AddView(forward); | |
| 91 layout->AddView(reload); | |
| 92 layout->AddView(location_bar); | |
| 93 } | |
| 94 | |
| 95 private: | |
| 96 DISALLOW_COPY_AND_ASSIGN(ToolbarRowView); | |
| 97 }; | |
| 98 | |
| 99 } // namespace | |
| 100 | |
| 101 namespace chromeos { | |
| 102 | |
| 103 // Stub implementation of ContentSettingBubbleModelDelegate. | |
| 104 class StubBubbleModelDelegate : public ContentSettingBubbleModelDelegate { | |
| 105 public: | |
| 106 StubBubbleModelDelegate() {} | |
| 107 virtual ~StubBubbleModelDelegate() {} | |
| 108 | |
| 109 // ContentSettingBubbleModelDelegate implementation: | |
| 110 virtual void ShowCollectedCookiesDialog( | |
| 111 content::WebContents* web_contents) OVERRIDE { | |
| 112 } | |
| 113 | |
| 114 virtual void ShowContentSettingsPage(ContentSettingsType type) OVERRIDE { | |
| 115 } | |
| 116 | |
| 117 private: | |
| 118 DISALLOW_COPY_AND_ASSIGN(StubBubbleModelDelegate); | |
| 119 }; | |
| 120 | |
| 121 // SimpleWebViewDialog class --------------------------------------------------- | |
| 122 | |
| 123 SimpleWebViewDialog::SimpleWebViewDialog(Profile* profile) | |
| 124 : profile_(profile), | |
| 125 back_(NULL), | |
| 126 forward_(NULL), | |
| 127 reload_(NULL), | |
| 128 location_bar_(NULL), | |
| 129 web_view_(NULL), | |
| 130 bubble_model_delegate_(new StubBubbleModelDelegate) { | |
| 131 command_updater_.reset(new CommandUpdater(this)); | |
| 132 command_updater_->UpdateCommandEnabled(IDC_BACK, true); | |
| 133 command_updater_->UpdateCommandEnabled(IDC_FORWARD, true); | |
| 134 command_updater_->UpdateCommandEnabled(IDC_STOP, true); | |
| 135 command_updater_->UpdateCommandEnabled(IDC_RELOAD, true); | |
| 136 command_updater_->UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true); | |
| 137 command_updater_->UpdateCommandEnabled(IDC_RELOAD_CLEARING_CACHE, true); | |
| 138 } | |
| 139 | |
| 140 SimpleWebViewDialog::~SimpleWebViewDialog() { | |
| 141 if (web_view_ && web_view_->web_contents()) | |
| 142 web_view_->web_contents()->SetDelegate(NULL); | |
| 143 } | |
| 144 | |
| 145 void SimpleWebViewDialog::StartLoad(const GURL& url) { | |
| 146 if (!web_view_container_.get()) | |
| 147 web_view_container_.reset(new views::WebView(profile_)); | |
| 148 web_view_ = web_view_container_.get(); | |
| 149 web_view_->set_owned_by_client(); | |
| 150 web_view_->GetWebContents()->SetDelegate(this); | |
| 151 web_view_->LoadInitialURL(url); | |
| 152 | |
| 153 WebContents* web_contents = web_view_->GetWebContents(); | |
| 154 DCHECK(web_contents); | |
| 155 | |
| 156 // Create the password manager that is needed for the proxy. | |
| 157 ChromePasswordManagerClient::CreateForWebContentsWithAutofillManagerDelegate( | |
| 158 web_contents, | |
| 159 autofill::TabAutofillManagerDelegate::FromWebContents(web_contents)); | |
| 160 } | |
| 161 | |
| 162 void SimpleWebViewDialog::Init() { | |
| 163 toolbar_model_.reset(new ToolbarModelImpl(this)); | |
| 164 | |
| 165 set_background(views::Background::CreateSolidBackground(kDialogColor)); | |
| 166 | |
| 167 // Back/Forward buttons. | |
| 168 back_ = new views::ImageButton(this); | |
| 169 back_->set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON | | |
| 170 ui::EF_MIDDLE_MOUSE_BUTTON); | |
| 171 back_->set_tag(IDC_BACK); | |
| 172 back_->SetImageAlignment(views::ImageButton::ALIGN_RIGHT, | |
| 173 views::ImageButton::ALIGN_TOP); | |
| 174 back_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_BACK)); | |
| 175 back_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK)); | |
| 176 back_->set_id(VIEW_ID_BACK_BUTTON); | |
| 177 | |
| 178 forward_ = new views::ImageButton(this); | |
| 179 forward_->set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON | | |
| 180 ui::EF_MIDDLE_MOUSE_BUTTON); | |
| 181 forward_->set_tag(IDC_FORWARD); | |
| 182 forward_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_FORWARD)); | |
| 183 forward_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD)); | |
| 184 forward_->set_id(VIEW_ID_FORWARD_BUTTON); | |
| 185 | |
| 186 // Location bar. | |
| 187 location_bar_ = new LocationBarView(NULL, profile_, command_updater_.get(), | |
| 188 this, true); | |
| 189 | |
| 190 // Reload button. | |
| 191 reload_ = new ReloadButton(command_updater_.get()); | |
| 192 reload_->set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON | | |
| 193 ui::EF_MIDDLE_MOUSE_BUTTON); | |
| 194 reload_->set_tag(IDC_RELOAD); | |
| 195 reload_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_RELOAD)); | |
| 196 reload_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_RELOAD)); | |
| 197 reload_->set_id(VIEW_ID_RELOAD_BUTTON); | |
| 198 | |
| 199 // Use separate view to setup custom background. | |
| 200 ToolbarRowView* toolbar_row = new ToolbarRowView; | |
| 201 toolbar_row->Init(back_, forward_, reload_, location_bar_); | |
| 202 | |
| 203 // Layout. | |
| 204 GridLayout* layout = new GridLayout(this); | |
| 205 SetLayoutManager(layout); | |
| 206 | |
| 207 views::ColumnSet* column_set = layout->AddColumnSet(0); | |
| 208 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, | |
| 209 GridLayout::FIXED, 0, 0); | |
| 210 | |
| 211 column_set = layout->AddColumnSet(1); | |
| 212 column_set->AddPaddingColumn(0, kInnerMargin); | |
| 213 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, | |
| 214 GridLayout::FIXED, 0, 0); | |
| 215 column_set->AddPaddingColumn(0, kInnerMargin); | |
| 216 | |
| 217 // Setup layout rows. | |
| 218 layout->StartRow(0, 0); | |
| 219 layout->AddView(toolbar_row); | |
| 220 | |
| 221 layout->AddPaddingRow(0, kInnerMargin); | |
| 222 | |
| 223 layout->StartRow(1, 1); | |
| 224 layout->AddView(web_view_container_.get()); | |
| 225 layout->AddPaddingRow(0, kInnerMargin); | |
| 226 | |
| 227 LoadImages(); | |
| 228 | |
| 229 location_bar_->Init(); | |
| 230 UpdateReload(web_view_->web_contents()->IsLoading(), true); | |
| 231 | |
| 232 gfx::Rect bounds(CalculateScreenBounds(gfx::Size())); | |
| 233 bounds.Inset(kExternalMargin, kExternalMargin); | |
| 234 layout->set_minimum_size(bounds.size()); | |
| 235 | |
| 236 Layout(); | |
| 237 } | |
| 238 | |
| 239 void SimpleWebViewDialog::Layout() { | |
| 240 views::WidgetDelegateView::Layout(); | |
| 241 } | |
| 242 | |
| 243 views::View* SimpleWebViewDialog::GetContentsView() { | |
| 244 return this; | |
| 245 } | |
| 246 | |
| 247 views::View* SimpleWebViewDialog::GetInitiallyFocusedView() { | |
| 248 return web_view_; | |
| 249 } | |
| 250 | |
| 251 void SimpleWebViewDialog::ButtonPressed(views::Button* sender, | |
| 252 const ui::Event& event) { | |
| 253 command_updater_->ExecuteCommand(sender->tag()); | |
| 254 } | |
| 255 | |
| 256 content::WebContents* SimpleWebViewDialog::OpenURL( | |
| 257 const content::OpenURLParams& params) { | |
| 258 // As there are no Browsers right now, this could not actually ever work. | |
| 259 NOTIMPLEMENTED(); | |
| 260 return NULL; | |
| 261 } | |
| 262 | |
| 263 void SimpleWebViewDialog::NavigationStateChanged( | |
| 264 const WebContents* source, unsigned changed_flags) { | |
| 265 if (location_bar_) { | |
| 266 location_bar_->Update(NULL); | |
| 267 UpdateButtons(); | |
| 268 } | |
| 269 } | |
| 270 | |
| 271 void SimpleWebViewDialog::LoadingStateChanged(WebContents* source, | |
| 272 bool to_different_document) { | |
| 273 bool is_loading = source->IsLoading(); | |
| 274 UpdateReload(is_loading && to_different_document, false); | |
| 275 command_updater_->UpdateCommandEnabled(IDC_STOP, is_loading); | |
| 276 } | |
| 277 | |
| 278 WebContents* SimpleWebViewDialog::GetWebContents() { | |
| 279 return NULL; | |
| 280 } | |
| 281 | |
| 282 ToolbarModel* SimpleWebViewDialog::GetToolbarModel() { | |
| 283 return toolbar_model_.get(); | |
| 284 } | |
| 285 | |
| 286 const ToolbarModel* SimpleWebViewDialog::GetToolbarModel() const { | |
| 287 return toolbar_model_.get(); | |
| 288 } | |
| 289 | |
| 290 InstantController* SimpleWebViewDialog::GetInstant() { | |
| 291 return NULL; | |
| 292 } | |
| 293 | |
| 294 views::Widget* SimpleWebViewDialog::CreateViewsBubble( | |
| 295 views::BubbleDelegateView* bubble_delegate) { | |
| 296 return views::BubbleDelegateView::CreateBubble(bubble_delegate); | |
| 297 } | |
| 298 | |
| 299 ContentSettingBubbleModelDelegate* | |
| 300 SimpleWebViewDialog::GetContentSettingBubbleModelDelegate() { | |
| 301 return bubble_model_delegate_.get(); | |
| 302 } | |
| 303 | |
| 304 void SimpleWebViewDialog::ShowWebsiteSettings( | |
| 305 content::WebContents* web_contents, | |
| 306 const GURL& url, | |
| 307 const content::SSLStatus& ssl) { | |
| 308 NOTIMPLEMENTED(); | |
| 309 // TODO (ygorshenin@,markusheintz@): implement this | |
| 310 } | |
| 311 | |
| 312 PageActionImageView* SimpleWebViewDialog::CreatePageActionImageView( | |
| 313 LocationBarView* owner, | |
| 314 ExtensionAction* action) { | |
| 315 // Notreached because SimpleWebViewDialog uses a popup-mode LocationBarView, | |
| 316 // and it doesn't create PageActionImageViews. | |
| 317 NOTREACHED(); | |
| 318 return NULL; | |
| 319 } | |
| 320 | |
| 321 content::WebContents* SimpleWebViewDialog::GetActiveWebContents() const { | |
| 322 return web_view_->web_contents(); | |
| 323 } | |
| 324 | |
| 325 bool SimpleWebViewDialog::InTabbedBrowser() const { | |
| 326 return false; | |
| 327 } | |
| 328 | |
| 329 void SimpleWebViewDialog::ExecuteCommandWithDisposition( | |
| 330 int id, | |
| 331 WindowOpenDisposition) { | |
| 332 WebContents* web_contents = web_view_->web_contents(); | |
| 333 switch (id) { | |
| 334 case IDC_BACK: | |
| 335 if (web_contents->GetController().CanGoBack()) { | |
| 336 location_bar_->Revert(); | |
| 337 web_contents->GetController().GoBack(); | |
| 338 } | |
| 339 break; | |
| 340 case IDC_FORWARD: | |
| 341 if (web_contents->GetController().CanGoForward()) { | |
| 342 location_bar_->Revert(); | |
| 343 web_contents->GetController().GoForward(); | |
| 344 } | |
| 345 break; | |
| 346 case IDC_STOP: | |
| 347 web_contents->Stop(); | |
| 348 break; | |
| 349 case IDC_RELOAD: | |
| 350 // Always reload ignoring cache. | |
| 351 case IDC_RELOAD_IGNORING_CACHE: | |
| 352 case IDC_RELOAD_CLEARING_CACHE: | |
| 353 location_bar_->Revert(); | |
| 354 web_contents->GetController().ReloadIgnoringCache(true); | |
| 355 break; | |
| 356 default: | |
| 357 NOTREACHED(); | |
| 358 } | |
| 359 } | |
| 360 | |
| 361 void SimpleWebViewDialog::LoadImages() { | |
| 362 ui::ThemeProvider* tp = GetThemeProvider(); | |
| 363 | |
| 364 back_->SetImage(views::CustomButton::STATE_NORMAL, | |
| 365 tp->GetImageSkiaNamed(IDR_BACK)); | |
| 366 back_->SetImage(views::CustomButton::STATE_HOVERED, | |
| 367 tp->GetImageSkiaNamed(IDR_BACK_H)); | |
| 368 back_->SetImage(views::CustomButton::STATE_PRESSED, | |
| 369 tp->GetImageSkiaNamed(IDR_BACK_P)); | |
| 370 back_->SetImage(views::CustomButton::STATE_DISABLED, | |
| 371 tp->GetImageSkiaNamed(IDR_BACK_D)); | |
| 372 | |
| 373 forward_->SetImage(views::CustomButton::STATE_NORMAL, | |
| 374 tp->GetImageSkiaNamed(IDR_FORWARD)); | |
| 375 forward_->SetImage(views::CustomButton::STATE_HOVERED, | |
| 376 tp->GetImageSkiaNamed(IDR_FORWARD_H)); | |
| 377 forward_->SetImage(views::CustomButton::STATE_PRESSED, | |
| 378 tp->GetImageSkiaNamed(IDR_FORWARD_P)); | |
| 379 forward_->SetImage(views::CustomButton::STATE_DISABLED, | |
| 380 tp->GetImageSkiaNamed(IDR_FORWARD_D)); | |
| 381 | |
| 382 reload_->LoadImages(); | |
| 383 } | |
| 384 | |
| 385 void SimpleWebViewDialog::UpdateButtons() { | |
| 386 const content::NavigationController& navigation_controller = | |
| 387 web_view_->web_contents()->GetController(); | |
| 388 back_->SetEnabled(navigation_controller.CanGoBack()); | |
| 389 forward_->SetEnabled(navigation_controller.CanGoForward()); | |
| 390 } | |
| 391 | |
| 392 void SimpleWebViewDialog::UpdateReload(bool is_loading, bool force) { | |
| 393 if (reload_) { | |
| 394 reload_->ChangeMode( | |
| 395 is_loading ? ReloadButton::MODE_STOP : ReloadButton::MODE_RELOAD, | |
| 396 force); | |
| 397 } | |
| 398 } | |
| 399 | |
| 400 } // namespace chromeos | |
| OLD | NEW |