web_page_view.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1// Copyright (c) 2009 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/web_page_view.h"
6
7#include "app/l10n_util.h"
8#include "app/resource_bundle.h"
9#include "base/callback.h"
10#include "base/string_util.h"
11#include "base/time.h"
12#include "base/values.h"
13#include "chrome/browser/child_process_security_policy.h"
14#include "chrome/browser/chromeos/login/helper.h"
15#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
16#include "chrome/browser/dom_ui/dom_ui.h"
17#include "chrome/browser/tab_contents/tab_contents.h"
18#include "chrome/common/bindings_policy.h"
19#include "gfx/canvas.h"
20#include "grit/generated_resources.h"
21#include "grit/theme_resources.h"
22#include "ipc/ipc_message.h"
23#include "third_party/skia/include/core/SkColor.h"
24#include "views/background.h"
25#include "views/border.h"
26#include "views/controls/label.h"
27#include "views/controls/throbber.h"
28
29using base::TimeDelta;
30using views::Label;
31using views::View;
32using webkit_glue::FormData;
33
34namespace chromeos {
35
36namespace {
37
38// Spacing (vertical/horizontal) between controls.
39const int kSpacing = 10;
40
41// Time in ms after that waiting controls are shown on Start.
42const int kStartDelayMs = 500;
43
44// Time in ms after that waiting controls are hidden on Stop.
45const int kStopDelayMs = 500;
46
47}  // namespace
48
49///////////////////////////////////////////////////////////////////////////////
50// WizardWebPageViewTabContents, public:
51
52WizardWebPageViewTabContents::WizardWebPageViewTabContents(
53    Profile* profile,
54    SiteInstance* site_instance,
55    WebPageDelegate* page_delegate)
56      : TabContents(profile, site_instance, MSG_ROUTING_NONE, NULL),
57        page_delegate_(page_delegate) {
58  }
59
60void WizardWebPageViewTabContents::DidFailProvisionalLoadWithError(
61      RenderViewHost* render_view_host,
62      bool is_main_frame,
63      int error_code,
64      const GURL& url,
65      bool showing_repost_interstitial) {
66  page_delegate_->OnPageLoadFailed(url.spec());
67}
68
69void WizardWebPageViewTabContents::DidDisplayInsecureContent() {
70  page_delegate_->OnPageLoadFailed("");
71}
72
73void WizardWebPageViewTabContents::DidRunInsecureContent(
74    const std::string& security_origin) {
75  page_delegate_->OnPageLoadFailed(security_origin);
76}
77
78void WizardWebPageViewTabContents::DocumentLoadedInFrame() {
79  page_delegate_->OnPageLoaded();
80}
81
82void WizardWebPageViewTabContents::OnContentBlocked(ContentSettingsType type) {
83  page_delegate_->OnPageLoadFailed("");
84}
85
86///////////////////////////////////////////////////////////////////////////////
87// WebPageDomView, public:
88
89void WebPageDomView::SetTabContentsDelegate(
90    TabContentsDelegate* delegate) {
91  tab_contents_->set_delegate(delegate);
92}
93
94///////////////////////////////////////////////////////////////////////////////
95// WebPageView, public:
96
97void WebPageView::Init() {
98  views::Painter* painter = CreateWizardPainter(
99      &BorderDefinition::kScreenBorder);
100  set_background(
101      views::Background::CreateBackgroundPainter(true, painter));
102  set_border(CreateWizardBorder(&BorderDefinition::kScreenBorder));
103  dom_view()->SetVisible(false);
104  AddChildView(dom_view());
105
106  throbber_ = CreateDefaultThrobber();
107  AddChildView(throbber_);
108
109  connecting_label_ = new views::Label();
110  connecting_label_->SetText(l10n_util::GetString(IDS_LOAD_STATE_CONNECTING));
111  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
112  connecting_label_->SetFont(rb.GetFont(ResourceBundle::MediumFont));
113  connecting_label_->SetVisible(false);
114  AddChildView(connecting_label_ );
115
116  start_timer_.Start(TimeDelta::FromMilliseconds(kStartDelayMs),
117                     this,
118                     &WebPageView::ShowWaitingControls);
119}
120
121void WebPageView::InitDOM(Profile* profile,
122                          SiteInstance* site_instance) {
123  dom_view()->Init(profile, site_instance);
124}
125
126void WebPageView::LoadURL(const GURL& url) {
127  dom_view()->LoadURL(url);
128}
129
130void WebPageView::SetTabContentsDelegate(
131    TabContentsDelegate* delegate) {
132  dom_view()->SetTabContentsDelegate(delegate);
133}
134
135void WebPageView::SetWebPageDelegate(WebPageDelegate* delegate) {
136  dom_view()->set_web_page_delegate(delegate);
137}
138
139void WebPageView::ShowPageContent() {
140  // TODO(nkostylev): Show throbber as an overlay until page has been rendered.
141  start_timer_.Stop();
142  if (!stop_timer_.IsRunning()) {
143    stop_timer_.Start(TimeDelta::FromMilliseconds(kStopDelayMs),
144                      this,
145                      &WebPageView::ShowRenderedPage);
146  }
147}
148
149///////////////////////////////////////////////////////////////////////////////
150// WebPageView, private:
151
152void WebPageView::ShowRenderedPage() {
153  throbber_->Stop();
154  connecting_label_->SetVisible(false);
155  dom_view()->SetVisible(true);
156}
157
158void WebPageView::ShowWaitingControls() {
159  throbber_->Start();
160  connecting_label_->SetVisible(true);
161}
162
163///////////////////////////////////////////////////////////////////////////////
164// WebPageView, views::View implementation:
165
166void WebPageView::Layout() {
167  dom_view()->SetBounds(GetLocalBounds(false));
168  int y = height() / 2  - throbber_->GetPreferredSize().height() / 2;
169  throbber_->SetBounds(
170      width() / 2 - throbber_->GetPreferredSize().width() / 2,
171      y,
172      throbber_->GetPreferredSize().width(),
173      throbber_->GetPreferredSize().height());
174  connecting_label_->SetBounds(
175      width() / 2 - connecting_label_->GetPreferredSize().width() / 2,
176      y + throbber_->GetPreferredSize().height() + kSpacing,
177      connecting_label_->GetPreferredSize().width(),
178      connecting_label_->GetPreferredSize().height());
179}
180
181}  // namespace chromeos
182