Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "athena/content/web_activity.h" | 5 #include "athena/content/web_activity.h" |
| 6 | 6 |
| 7 #include "athena/activity/public/activity_factory.h" | 7 #include "athena/activity/public/activity_factory.h" |
| 8 #include "athena/activity/public/activity_manager.h" | 8 #include "athena/activity/public/activity_manager.h" |
| 9 #include "athena/content/public/dialogs.h" | 9 #include "athena/content/public/dialogs.h" |
| 10 #include "athena/input/public/accelerator_manager.h" | 10 #include "athena/input/public/accelerator_manager.h" |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "content/public/browser/native_web_keyboard_event.h" | 14 #include "content/public/browser/native_web_keyboard_event.h" |
| 15 #include "content/public/browser/navigation_controller.h" | 15 #include "content/public/browser/navigation_controller.h" |
| 16 #include "content/public/browser/web_contents.h" | 16 #include "content/public/browser/web_contents.h" |
| 17 #include "content/public/browser/web_contents_delegate.h" | 17 #include "content/public/browser/web_contents_delegate.h" |
| 18 #include "content/public/common/content_switches.h" | 18 #include "content/public/common/content_switches.h" |
| 19 #include "ui/aura/window.h" | 19 #include "ui/aura/window.h" |
| 20 #include "ui/compositor/closure_animation_observer.h" | 20 #include "ui/compositor/closure_animation_observer.h" |
| 21 #include "ui/compositor/scoped_layer_animation_settings.h" | 21 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 22 #include "ui/views/background.h" | |
| 23 #include "ui/views/controls/label.h" | |
| 22 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" | 24 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" |
| 23 #include "ui/views/controls/webview/webview.h" | 25 #include "ui/views/controls/webview/webview.h" |
| 24 #include "ui/views/focus/focus_manager.h" | 26 #include "ui/views/focus/focus_manager.h" |
| 25 #include "ui/views/widget/widget.h" | 27 #include "ui/views/widget/widget.h" |
| 26 | 28 |
| 27 namespace athena { | 29 namespace athena { |
| 28 namespace { | 30 namespace { |
| 29 | 31 |
| 30 class WebActivityController : public AcceleratorHandler { | 32 class WebActivityController : public AcceleratorHandler { |
| 31 public: | 33 public: |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 views::WebView* web_view_; | 141 views::WebView* web_view_; |
| 140 bool reserved_accelerator_enabled_; | 142 bool reserved_accelerator_enabled_; |
| 141 scoped_ptr<AcceleratorManager> accelerator_manager_; | 143 scoped_ptr<AcceleratorManager> accelerator_manager_; |
| 142 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; | 144 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; |
| 143 | 145 |
| 144 DISALLOW_COPY_AND_ASSIGN(WebActivityController); | 146 DISALLOW_COPY_AND_ASSIGN(WebActivityController); |
| 145 }; | 147 }; |
| 146 | 148 |
| 147 const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); | 149 const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); |
| 148 const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77); | 150 const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77); |
| 151 const int kDistanceShowReloadMessage = 30; | |
| 152 const int kDistanceReload = 70; | |
| 149 | 153 |
| 150 } // namespace | 154 } // namespace |
| 151 | 155 |
| 152 // A web view for athena's web activity. Note that AthenaWebView will create its | 156 // A web view for athena's web activity. Note that AthenaWebView will create its |
| 153 // own content so that it can eject and reload it. | 157 // own content so that it can eject and reload it. |
| 154 class AthenaWebView : public views::WebView { | 158 class AthenaWebView : public views::WebView { |
| 155 public: | 159 public: |
| 156 AthenaWebView(content::BrowserContext* context) | 160 AthenaWebView(content::BrowserContext* context) |
| 157 : views::WebView(context), controller_(new WebActivityController(this)), | 161 : views::WebView(context), controller_(new WebActivityController(this)), |
| 158 fullscreen_(false) { | 162 fullscreen_(false), |
| 163 overscroll_y_(0) { | |
| 159 SetEmbedFullscreenWidgetMode(true); | 164 SetEmbedFullscreenWidgetMode(true); |
| 160 // TODO(skuhne): Add content observer to detect renderer crash and set | 165 // TODO(skuhne): Add content observer to detect renderer crash and set |
| 161 // content status to unloaded if that happens. | 166 // content status to unloaded if that happens. |
| 162 } | 167 } |
| 163 | 168 |
| 164 AthenaWebView(content::WebContents* web_contents) | 169 AthenaWebView(content::WebContents* web_contents) |
| 165 : views::WebView(web_contents->GetBrowserContext()), | 170 : views::WebView(web_contents->GetBrowserContext()), |
| 166 controller_(new WebActivityController(this)) { | 171 controller_(new WebActivityController(this)) { |
| 167 scoped_ptr<content::WebContents> old_contents( | 172 scoped_ptr<content::WebContents> old_contents( |
| 168 SwapWebContents(scoped_ptr<content::WebContents>(web_contents))); | 173 SwapWebContents(scoped_ptr<content::WebContents>(web_contents))); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 233 // NULL is returned if the URL wasn't opened immediately. | 238 // NULL is returned if the URL wasn't opened immediately. |
| 234 return NULL; | 239 return NULL; |
| 235 } | 240 } |
| 236 | 241 |
| 237 virtual bool CanOverscrollContent() const OVERRIDE { | 242 virtual bool CanOverscrollContent() const OVERRIDE { |
| 238 const std::string value = CommandLine::ForCurrentProcess()-> | 243 const std::string value = CommandLine::ForCurrentProcess()-> |
| 239 GetSwitchValueASCII(switches::kOverscrollHistoryNavigation); | 244 GetSwitchValueASCII(switches::kOverscrollHistoryNavigation); |
| 240 return value != "0"; | 245 return value != "0"; |
| 241 } | 246 } |
| 242 | 247 |
| 248 virtual void OverscrollUpdate(int delta_y) OVERRIDE { | |
| 249 overscroll_y_ = delta_y; | |
| 250 if (overscroll_y_ > kDistanceShowReloadMessage) { | |
| 251 if (!reload_message_) | |
| 252 CreateReloadMessage(); | |
| 253 reload_message_->Show(); | |
| 254 float opacity = (overscroll_y_ - kDistanceReload) / | |
| 255 static_cast<float>(kDistanceReload - kDistanceShowReloadMessage); | |
| 256 reload_message_->GetLayer()->SetOpacity(std::min(1.0f, opacity)); | |
|
sadrul
2014/09/11 04:33:14
opacity will be negative when overscroll_y_ < kDis
pkotwicz
2014/09/11 22:51:40
Thanks for catching this.
I cannot use gfx::Tween
| |
| 257 } else if (reload_message_) { | |
| 258 reload_message_->Hide(); | |
| 259 } | |
| 260 } | |
| 261 | |
| 262 virtual void OverscrollComplete() OVERRIDE { | |
| 263 if (overscroll_y_ >= kDistanceReload) { | |
| 264 reload_message_->Hide(); | |
| 265 overscroll_y_ = 0; | |
| 266 | |
| 267 GetWebContents()->GetController().Reload(false); | |
| 268 } | |
| 269 } | |
| 270 | |
| 243 virtual void AddNewContents(content::WebContents* source, | 271 virtual void AddNewContents(content::WebContents* source, |
| 244 content::WebContents* new_contents, | 272 content::WebContents* new_contents, |
| 245 WindowOpenDisposition disposition, | 273 WindowOpenDisposition disposition, |
| 246 const gfx::Rect& initial_pos, | 274 const gfx::Rect& initial_pos, |
| 247 bool user_gesture, | 275 bool user_gesture, |
| 248 bool* was_blocked) OVERRIDE { | 276 bool* was_blocked) OVERRIDE { |
| 249 ActivityManager::Get()->AddActivity( | 277 ActivityManager::Get()->AddActivity( |
| 250 new WebActivity(new AthenaWebView(new_contents))); | 278 new WebActivity(new AthenaWebView(new_contents))); |
| 251 } | 279 } |
| 252 | 280 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 317 return athena::OpenFileChooser(web_contents, params); | 345 return athena::OpenFileChooser(web_contents, params); |
| 318 } | 346 } |
| 319 | 347 |
| 320 private: | 348 private: |
| 321 void CreateProgressBar() { | 349 void CreateProgressBar() { |
| 322 CHECK(!progress_bar_); | 350 CHECK(!progress_bar_); |
| 323 progress_bar_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); | 351 progress_bar_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); |
| 324 progress_bar_->SetColor(SkColorSetRGB(0x17, 0x59, 0xcd)); | 352 progress_bar_->SetColor(SkColorSetRGB(0x17, 0x59, 0xcd)); |
| 325 } | 353 } |
| 326 | 354 |
| 355 void CreateReloadMessage() { | |
| 356 CHECK(!reload_message_); | |
| 357 reload_message_.reset(new views::Widget); | |
| 358 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); | |
| 359 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | |
| 360 params.parent = GetWidget()->GetNativeView(); | |
| 361 reload_message_->Init(params); | |
| 362 | |
| 363 views::Label* label = new views::Label(base::UTF8ToUTF16("Reload")); | |
| 364 label->SetBackgroundColor(SK_ColorGRAY); | |
| 365 label->set_background( | |
| 366 views::Background::CreateSolidBackground(SK_ColorGRAY)); | |
| 367 | |
| 368 reload_message_->SetContentsView(label); | |
| 369 reload_message_->SetBounds(ConvertRectToWidget( | |
| 370 gfx::Rect(0, 0, width(), label->GetPreferredSize().height()))); | |
| 371 } | |
| 372 | |
| 327 scoped_ptr<WebActivityController> controller_; | 373 scoped_ptr<WebActivityController> controller_; |
| 328 | 374 |
| 329 // If the activity got evicted, this is the web content which holds the known | 375 // If the activity got evicted, this is the web content which holds the known |
| 330 // state of the content before eviction. | 376 // state of the content before eviction. |
| 331 scoped_ptr<content::WebContents> evicted_web_contents_; | 377 scoped_ptr<content::WebContents> evicted_web_contents_; |
| 332 | 378 |
| 333 scoped_ptr<ui::Layer> progress_bar_; | 379 scoped_ptr<ui::Layer> progress_bar_; |
| 334 | 380 |
| 381 scoped_ptr<views::Widget> reload_message_; | |
| 382 | |
| 335 // TODO(oshima): Find out if we should support window fullscreen. | 383 // TODO(oshima): Find out if we should support window fullscreen. |
| 336 // It may still useful when a user is in split mode. | 384 // It may still useful when a user is in split mode. |
| 337 bool fullscreen_; | 385 bool fullscreen_; |
| 338 | 386 |
| 387 // The distance that the user has overscrolled vertically. | |
| 388 int overscroll_y_; | |
| 389 | |
| 339 DISALLOW_COPY_AND_ASSIGN(AthenaWebView); | 390 DISALLOW_COPY_AND_ASSIGN(AthenaWebView); |
| 340 }; | 391 }; |
| 341 | 392 |
| 342 WebActivity::WebActivity(content::BrowserContext* browser_context, | 393 WebActivity::WebActivity(content::BrowserContext* browser_context, |
| 343 const base::string16& title, | 394 const base::string16& title, |
| 344 const GURL& url) | 395 const GURL& url) |
| 345 : browser_context_(browser_context), | 396 : browser_context_(browser_context), |
| 346 title_(title), | 397 title_(title), |
| 347 url_(url), | 398 url_(url), |
| 348 web_view_(NULL), | 399 web_view_(NULL), |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 | 592 |
| 542 void WebActivity::ReloadAndObserve() { | 593 void WebActivity::ReloadAndObserve() { |
| 543 if (web_view_->IsContentEvicted()) { | 594 if (web_view_->IsContentEvicted()) { |
| 544 DCHECK_EQ(ACTIVITY_UNLOADED, current_state_); | 595 DCHECK_EQ(ACTIVITY_UNLOADED, current_state_); |
| 545 web_view_->ReloadContent(); | 596 web_view_->ReloadContent(); |
| 546 } | 597 } |
| 547 Observe(web_view_->GetWebContents()); | 598 Observe(web_view_->GetWebContents()); |
| 548 } | 599 } |
| 549 | 600 |
| 550 } // namespace athena | 601 } // namespace athena |
| OLD | NEW |