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
30using base::TimeDelta;
31using views::Label;
32using views::View;
33using webkit_glue::FormData;
34
35namespace chromeos {
36
37namespace {
38
39// Spacing (vertical/horizontal) between controls.
40const int kSpacing = 10;
41
42// Time in ms after that waiting controls are shown on Start.
43const int kStartDelayMs = 500;
44
45// Time in ms after that waiting controls are hidden on Stop.
46const int kStopDelayMs = 500;
47
48}  // namespace
49
50///////////////////////////////////////////////////////////////////////////////
51// WizardWebPageViewTabContents, public:
52
53WizardWebPageViewTabContents::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
61void 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
71void WizardWebPageViewTabContents::DidDisplayInsecureContent() {
72  LOG(ERROR) << "Page load failed: did display insecure content";
73  page_delegate_->OnPageLoadFailed("Displayed insecure content");
74}
75
76void 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
82void WizardWebPageViewTabContents::DocumentLoadedInFrame(
83    long long /*frame_id*/) {
84  page_delegate_->OnPageLoaded();
85}
86
87void WizardWebPageViewTabContents::DidFinishLoad(
88    long long /*frame_id*/) {
89}
90
91void 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
99void WebPageDomView::SetTabContentsDelegate(
100    TabContentsDelegate* delegate) {
101  tab_contents_->set_delegate(delegate);
102}
103
104///////////////////////////////////////////////////////////////////////////////
105// WebPageView, public:
106
107void 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
132void WebPageView::InitDOM(Profile* profile,
133                          SiteInstance* site_instance) {
134  dom_view()->Init(profile, site_instance);
135}
136
137void WebPageView::LoadURL(const GURL& url) {
138  dom_view()->LoadURL(url);
139}
140
141void WebPageView::SetTabContentsDelegate(
142    TabContentsDelegate* delegate) {
143  dom_view()->SetTabContentsDelegate(delegate);
144}
145
146void WebPageView::SetWebPageDelegate(WebPageDelegate* delegate) {
147  dom_view()->set_web_page_delegate(delegate);
148}
149
150void 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
163void WebPageView::ShowRenderedPage() {
164  throbber_->Stop();
165  connecting_label_->SetVisible(false);
166  dom_view()->SetVisible(true);
167}
168
169void WebPageView::ShowWaitingControls() {
170  throbber_->Start();
171  connecting_label_->SetVisible(true);
172}
173
174///////////////////////////////////////////////////////////////////////////////
175// WebPageView, views::View implementation:
176
177void 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