• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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