Index: athena/content/web_activity.cc |
diff --git a/athena/content/web_activity.cc b/athena/content/web_activity.cc |
index 580fb7dc9a116556370cb4e756f1d41abaadd22e..275acedbc6dfc7a2070aa510e04ddabff99b7b72 100644 |
--- a/athena/content/web_activity.cc |
+++ b/athena/content/web_activity.cc |
@@ -22,6 +22,8 @@ |
#include "ui/aura/window.h" |
#include "ui/compositor/closure_animation_observer.h" |
#include "ui/compositor/scoped_layer_animation_settings.h" |
+#include "ui/views/background.h" |
+#include "ui/views/controls/label.h" |
#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" |
#include "ui/views/controls/webview/webview.h" |
#include "ui/views/focus/focus_manager.h" |
@@ -150,6 +152,8 @@ class WebActivityController : public AcceleratorHandler { |
const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); |
const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77); |
const int kIconSize = 32; |
+const int kDistanceShowReloadMessage = 100; |
+const int kDistanceReload = 150; |
} // namespace |
@@ -159,7 +163,8 @@ class AthenaWebView : public views::WebView { |
public: |
AthenaWebView(content::BrowserContext* context) |
: views::WebView(context), controller_(new WebActivityController(this)), |
- fullscreen_(false) { |
+ fullscreen_(false), |
+ overscroll_y_(0) { |
SetEmbedFullscreenWidgetMode(true); |
// TODO(skuhne): Add content observer to detect renderer crash and set |
// content status to unloaded if that happens. |
@@ -248,6 +253,32 @@ class AthenaWebView : public views::WebView { |
return value != "0"; |
} |
+ virtual void OverscrollUpdate(int delta_y) OVERRIDE { |
+ overscroll_y_ = delta_y; |
+ if (overscroll_y_ > kDistanceShowReloadMessage) { |
+ if (!reload_message_) |
+ CreateReloadMessage(); |
+ reload_message_->Show(); |
+ float opacity = 1.0f; |
+ if (overscroll_y_ < kDistanceReload) { |
+ opacity = |
+ (overscroll_y_ - kDistanceShowReloadMessage) / |
+ static_cast<float>(kDistanceReload - kDistanceShowReloadMessage); |
+ } |
+ reload_message_->GetLayer()->SetOpacity(opacity); |
+ } else if (reload_message_) { |
+ reload_message_->Hide(); |
+ } |
+ } |
+ |
+ virtual void OverscrollComplete() OVERRIDE { |
+ if (overscroll_y_ >= kDistanceReload) |
+ GetWebContents()->GetController().Reload(false); |
+ if (reload_message_) |
+ reload_message_->Hide(); |
+ overscroll_y_ = 0; |
+ } |
+ |
virtual void AddNewContents(content::WebContents* source, |
content::WebContents* new_contents, |
WindowOpenDisposition disposition, |
@@ -332,6 +363,24 @@ class AthenaWebView : public views::WebView { |
progress_bar_->SetColor(SkColorSetRGB(0x17, 0x59, 0xcd)); |
} |
+ void CreateReloadMessage() { |
+ CHECK(!reload_message_); |
+ reload_message_.reset(new views::Widget); |
+ views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); |
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ params.parent = GetWidget()->GetNativeView(); |
+ reload_message_->Init(params); |
+ |
+ views::Label* label = new views::Label(base::UTF8ToUTF16("Reload")); |
+ label->SetBackgroundColor(SK_ColorGRAY); |
+ label->set_background( |
+ views::Background::CreateSolidBackground(SK_ColorGRAY)); |
+ |
+ reload_message_->SetContentsView(label); |
+ reload_message_->SetBounds(ConvertRectToWidget( |
+ gfx::Rect(0, 0, width(), label->GetPreferredSize().height()))); |
+ } |
+ |
scoped_ptr<WebActivityController> controller_; |
// If the activity got evicted, this is the web content which holds the known |
@@ -340,10 +389,15 @@ class AthenaWebView : public views::WebView { |
scoped_ptr<ui::Layer> progress_bar_; |
+ scoped_ptr<views::Widget> reload_message_; |
+ |
// TODO(oshima): Find out if we should support window fullscreen. |
// It may still useful when a user is in split mode. |
bool fullscreen_; |
+ // The distance that the user has overscrolled vertically. |
+ int overscroll_y_; |
+ |
DISALLOW_COPY_AND_ASSIGN(AthenaWebView); |
}; |