Disable view source for Developer Tools.
[chromium-blink-merge.git] / chrome / browser / chromeos / login / simple_web_view_dialog.cc
blob7e5ca5ed5ffe33d0fc9a65b44031640e2724e356
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.
5 #include "chrome/browser/chromeos/login/simple_web_view_dialog.h"
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/password_manager.h"
16 #include "chrome/browser/password_manager/password_manager_delegate_impl.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/ui/browser.h"
19 #include "chrome/browser/ui/content_settings/content_setting_bubble_model_delegate.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 "content/public/browser/navigation_controller.h"
25 #include "content/public/browser/navigation_entry.h"
26 #include "content/public/browser/web_contents.h"
27 #include "grit/generated_resources.h"
28 #include "grit/theme_resources.h"
29 #include "ipc/ipc_message.h"
30 #include "ui/base/l10n/l10n_util.h"
31 #include "ui/base/theme_provider.h"
32 #include "ui/views/background.h"
33 #include "ui/views/controls/webview/webview.h"
34 #include "ui/views/layout/grid_layout.h"
35 #include "ui/views/layout/layout_constants.h"
36 #include "ui/views/view.h"
37 #include "ui/views/widget/widget.h"
39 using content::WebContents;
40 using views::GridLayout;
42 namespace {
44 const int kLocationBarHeight = 35;
46 // Margin between screen edge and SimpleWebViewDialog border.
47 const int kExternalMargin = 60;
49 // Margin between WebView and SimpleWebViewDialog border.
50 const int kInnerMargin = 2;
52 const SkColor kDialogColor = SK_ColorWHITE;
54 class ToolbarRowView : public views::View {
55 public:
56 ToolbarRowView() {
57 set_background(views::Background::CreateSolidBackground(kDialogColor));
60 virtual ~ToolbarRowView() {}
62 void Init(views::View* back,
63 views::View* forward,
64 views::View* reload,
65 views::View* location_bar) {
66 GridLayout* layout = new GridLayout(this);
67 SetLayoutManager(layout);
69 // Back button.
70 views::ColumnSet* column_set = layout->AddColumnSet(0);
71 column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0,
72 GridLayout::USE_PREF, 0, 0);
73 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
74 // Forward button.
75 column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0,
76 GridLayout::USE_PREF, 0, 0);
77 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
78 // Reload button.
79 column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0,
80 GridLayout::USE_PREF, 0, 0);
81 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
82 // Location bar.
83 column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1,
84 GridLayout::FIXED, kLocationBarHeight, 0);
85 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
87 layout->StartRow(0, 0);
88 layout->AddView(back);
89 layout->AddView(forward);
90 layout->AddView(reload);
91 layout->AddView(location_bar);
94 private:
95 DISALLOW_COPY_AND_ASSIGN(ToolbarRowView);
98 } // namespace
100 namespace chromeos {
102 // Stub implementation of ContentSettingBubbleModelDelegate.
103 class StubBubbleModelDelegate : public ContentSettingBubbleModelDelegate {
104 public:
105 StubBubbleModelDelegate() {}
106 virtual ~StubBubbleModelDelegate() {}
108 // ContentSettingBubbleModelDelegate implementation:
109 virtual void ShowCollectedCookiesDialog(
110 content::WebContents* web_contents) OVERRIDE {
113 virtual void ShowContentSettingsPage(ContentSettingsType type) OVERRIDE {
116 private:
117 DISALLOW_COPY_AND_ASSIGN(StubBubbleModelDelegate);
120 // SimpleWebViewDialog class ---------------------------------------------------
122 SimpleWebViewDialog::SimpleWebViewDialog(Profile* profile)
123 : profile_(profile),
124 back_(NULL),
125 forward_(NULL),
126 reload_(NULL),
127 location_bar_(NULL),
128 web_view_(NULL),
129 bubble_model_delegate_(new StubBubbleModelDelegate) {
130 command_updater_.reset(new CommandUpdater(this));
131 command_updater_->UpdateCommandEnabled(IDC_BACK, true);
132 command_updater_->UpdateCommandEnabled(IDC_FORWARD, true);
133 command_updater_->UpdateCommandEnabled(IDC_STOP, true);
134 command_updater_->UpdateCommandEnabled(IDC_RELOAD, true);
135 command_updater_->UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
136 command_updater_->UpdateCommandEnabled(IDC_RELOAD_CLEARING_CACHE, true);
139 SimpleWebViewDialog::~SimpleWebViewDialog() {
140 if (web_view_container_.get()) {
141 // WebView can't be deleted immediately, because it could be on the stack.
142 web_view_->web_contents()->SetDelegate(NULL);
143 base::MessageLoop::current()->DeleteSoon(
144 FROM_HERE, web_view_container_.release());
148 void SimpleWebViewDialog::StartLoad(const GURL& url) {
149 if (!web_view_container_.get())
150 web_view_container_.reset(new views::WebView(profile_));
151 web_view_ = web_view_container_.get();
152 web_view_->GetWebContents()->SetDelegate(this);
153 web_view_->LoadInitialURL(url);
155 WebContents* web_contents = web_view_->GetWebContents();
156 DCHECK(web_contents);
158 // Create the password manager that is needed for the proxy.
159 PasswordManagerDelegateImpl::CreateForWebContents(web_contents);
160 PasswordManager::CreateForWebContentsAndDelegate(
161 web_contents, PasswordManagerDelegateImpl::FromWebContents(web_contents));
164 void SimpleWebViewDialog::Init() {
165 toolbar_model_.reset(new ToolbarModelImpl(this));
167 set_background(views::Background::CreateSolidBackground(kDialogColor));
169 // Back/Forward buttons.
170 back_ = new views::ImageButton(this);
171 back_->set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON |
172 ui::EF_MIDDLE_MOUSE_BUTTON);
173 back_->set_tag(IDC_BACK);
174 back_->SetImageAlignment(views::ImageButton::ALIGN_RIGHT,
175 views::ImageButton::ALIGN_TOP);
176 back_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_BACK));
177 back_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK));
178 back_->set_id(VIEW_ID_BACK_BUTTON);
180 forward_ = new views::ImageButton(this);
181 forward_->set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON |
182 ui::EF_MIDDLE_MOUSE_BUTTON);
183 forward_->set_tag(IDC_FORWARD);
184 forward_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_FORWARD));
185 forward_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD));
186 forward_->set_id(VIEW_ID_FORWARD_BUTTON);
188 // Location bar.
189 location_bar_ = new LocationBarView(NULL, profile_, command_updater_.get(),
190 this, true);
192 // Reload button.
193 reload_ = new ReloadButton(location_bar_, command_updater_.get());
194 reload_->set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON |
195 ui::EF_MIDDLE_MOUSE_BUTTON);
196 reload_->set_tag(IDC_RELOAD);
197 reload_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_RELOAD));
198 reload_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_RELOAD));
199 reload_->set_id(VIEW_ID_RELOAD_BUTTON);
201 // Use separate view to setup custom background.
202 ToolbarRowView* toolbar_row = new ToolbarRowView;
203 toolbar_row->Init(back_, forward_, reload_, location_bar_);
205 // Layout.
206 GridLayout* layout = new GridLayout(this);
207 SetLayoutManager(layout);
209 views::ColumnSet* column_set = layout->AddColumnSet(0);
210 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
211 GridLayout::FIXED, 0, 0);
213 column_set = layout->AddColumnSet(1);
214 column_set->AddPaddingColumn(0, kInnerMargin);
215 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
216 GridLayout::FIXED, 0, 0);
217 column_set->AddPaddingColumn(0, kInnerMargin);
219 // Setup layout rows.
220 layout->StartRow(0, 0);
221 layout->AddView(toolbar_row);
223 layout->AddPaddingRow(0, kInnerMargin);
225 layout->StartRow(1, 1);
226 layout->AddView(web_view_container_.release());
227 layout->AddPaddingRow(0, kInnerMargin);
229 LoadImages();
231 location_bar_->Init();
232 UpdateReload(web_view_->web_contents()->IsLoading(), true);
234 gfx::Rect bounds(CalculateScreenBounds(gfx::Size()));
235 bounds.Inset(kExternalMargin, kExternalMargin);
236 layout->set_minimum_size(bounds.size());
238 Layout();
241 void SimpleWebViewDialog::Layout() {
242 views::WidgetDelegateView::Layout();
245 views::View* SimpleWebViewDialog::GetContentsView() {
246 return this;
249 views::View* SimpleWebViewDialog::GetInitiallyFocusedView() {
250 return web_view_;
253 void SimpleWebViewDialog::ButtonPressed(views::Button* sender,
254 const ui::Event& event) {
255 command_updater_->ExecuteCommand(sender->tag());
258 void SimpleWebViewDialog::NavigationStateChanged(
259 const WebContents* source, unsigned changed_flags) {
260 if (location_bar_) {
261 location_bar_->Update(NULL);
262 UpdateButtons();
266 content::WebContents* SimpleWebViewDialog::OpenURL(
267 const content::OpenURLParams& params) {
268 // As there are no Browsers right now, this could not actually ever work.
269 NOTIMPLEMENTED();
270 return NULL;
273 void SimpleWebViewDialog::LoadingStateChanged(WebContents* source) {
274 bool is_loading = source->IsLoading();
275 UpdateReload(is_loading, false);
276 command_updater_->UpdateCommandEnabled(IDC_STOP, is_loading);
279 WebContents* SimpleWebViewDialog::GetWebContents() {
280 return NULL;
283 ToolbarModel* SimpleWebViewDialog::GetToolbarModel() {
284 return toolbar_model_.get();
287 const ToolbarModel* SimpleWebViewDialog::GetToolbarModel() const {
288 return toolbar_model_.get();
291 InstantController* SimpleWebViewDialog::GetInstant() {
292 return NULL;
295 views::Widget* SimpleWebViewDialog::CreateViewsBubble(
296 views::BubbleDelegateView* bubble_delegate) {
297 return views::BubbleDelegateView::CreateBubble(bubble_delegate);
300 ContentSettingBubbleModelDelegate*
301 SimpleWebViewDialog::GetContentSettingBubbleModelDelegate() {
302 return bubble_model_delegate_.get();
305 void SimpleWebViewDialog::ShowWebsiteSettings(
306 content::WebContents* web_contents,
307 const GURL& url,
308 const content::SSLStatus& ssl) {
309 NOTIMPLEMENTED();
310 // TODO (ygorshenin@,markusheintz@): implement this
313 PageActionImageView* SimpleWebViewDialog::CreatePageActionImageView(
314 LocationBarView* owner,
315 ExtensionAction* action) {
316 // Notreached because SimpleWebViewDialog uses a popup-mode LocationBarView,
317 // and it doesn't create PageActionImageViews.
318 NOTREACHED();
319 return NULL;
322 content::WebContents* SimpleWebViewDialog::GetActiveWebContents() const {
323 return web_view_->web_contents();
326 void SimpleWebViewDialog::ExecuteCommandWithDisposition(
327 int id,
328 WindowOpenDisposition) {
329 WebContents* web_contents = web_view_->web_contents();
330 switch (id) {
331 case IDC_BACK:
332 if (web_contents->GetController().CanGoBack()) {
333 location_bar_->Revert();
334 web_contents->GetController().GoBack();
336 break;
337 case IDC_FORWARD:
338 if (web_contents->GetController().CanGoForward()) {
339 location_bar_->Revert();
340 web_contents->GetController().GoForward();
342 break;
343 case IDC_STOP:
344 web_contents->Stop();
345 break;
346 case IDC_RELOAD:
347 // Always reload ignoring cache.
348 case IDC_RELOAD_IGNORING_CACHE:
349 case IDC_RELOAD_CLEARING_CACHE:
350 web_contents->GetController().ReloadIgnoringCache(true);
351 break;
352 default:
353 NOTREACHED();
357 void SimpleWebViewDialog::LoadImages() {
358 ui::ThemeProvider* tp = GetThemeProvider();
360 back_->SetImage(views::CustomButton::STATE_NORMAL,
361 tp->GetImageSkiaNamed(IDR_BACK));
362 back_->SetImage(views::CustomButton::STATE_HOVERED,
363 tp->GetImageSkiaNamed(IDR_BACK_H));
364 back_->SetImage(views::CustomButton::STATE_PRESSED,
365 tp->GetImageSkiaNamed(IDR_BACK_P));
366 back_->SetImage(views::CustomButton::STATE_DISABLED,
367 tp->GetImageSkiaNamed(IDR_BACK_D));
369 forward_->SetImage(views::CustomButton::STATE_NORMAL,
370 tp->GetImageSkiaNamed(IDR_FORWARD));
371 forward_->SetImage(views::CustomButton::STATE_HOVERED,
372 tp->GetImageSkiaNamed(IDR_FORWARD_H));
373 forward_->SetImage(views::CustomButton::STATE_PRESSED,
374 tp->GetImageSkiaNamed(IDR_FORWARD_P));
375 forward_->SetImage(views::CustomButton::STATE_DISABLED,
376 tp->GetImageSkiaNamed(IDR_FORWARD_D));
378 reload_->LoadImages();
381 void SimpleWebViewDialog::UpdateButtons() {
382 const content::NavigationController& navigation_controller =
383 web_view_->web_contents()->GetController();
384 back_->SetEnabled(navigation_controller.CanGoBack());
385 forward_->SetEnabled(navigation_controller.CanGoForward());
388 void SimpleWebViewDialog::UpdateReload(bool is_loading, bool force) {
389 if (reload_) {
390 reload_->ChangeMode(
391 is_loading ? ReloadButton::MODE_STOP : ReloadButton::MODE_RELOAD,
392 force);
396 } // namespace chromeos