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