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