Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(777)

Side by Side Diff: athena/content/web_activity.cc

Issue 554393008: [Athena] Simple pull to refresh implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | athena/main/athena_launcher.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/content_proxy.h" 9 #include "athena/content/content_proxy.h"
10 #include "athena/content/public/dialogs.h" 10 #include "athena/content/public/dialogs.h"
11 #include "athena/input/public/accelerator_manager.h" 11 #include "athena/input/public/accelerator_manager.h"
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
15 #include "components/favicon_base/select_favicon_frames.h" 15 #include "components/favicon_base/select_favicon_frames.h"
16 #include "content/public/browser/native_web_keyboard_event.h" 16 #include "content/public/browser/native_web_keyboard_event.h"
17 #include "content/public/browser/navigation_controller.h" 17 #include "content/public/browser/navigation_controller.h"
18 #include "content/public/browser/web_contents.h" 18 #include "content/public/browser/web_contents.h"
19 #include "content/public/browser/web_contents_delegate.h" 19 #include "content/public/browser/web_contents_delegate.h"
20 #include "content/public/common/content_switches.h" 20 #include "content/public/common/content_switches.h"
21 #include "content/public/common/favicon_url.h" 21 #include "content/public/common/favicon_url.h"
22 #include "ui/aura/window.h" 22 #include "ui/aura/window.h"
23 #include "ui/compositor/closure_animation_observer.h" 23 #include "ui/compositor/closure_animation_observer.h"
24 #include "ui/compositor/scoped_layer_animation_settings.h" 24 #include "ui/compositor/scoped_layer_animation_settings.h"
25 #include "ui/views/background.h"
26 #include "ui/views/controls/label.h"
25 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" 27 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
26 #include "ui/views/controls/webview/webview.h" 28 #include "ui/views/controls/webview/webview.h"
27 #include "ui/views/focus/focus_manager.h" 29 #include "ui/views/focus/focus_manager.h"
28 #include "ui/views/widget/widget.h" 30 #include "ui/views/widget/widget.h"
29 31
30 namespace athena { 32 namespace athena {
31 namespace { 33 namespace {
32 34
33 class WebActivityController : public AcceleratorHandler { 35 class WebActivityController : public AcceleratorHandler {
34 public: 36 public:
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 bool reserved_accelerator_enabled_; 145 bool reserved_accelerator_enabled_;
144 scoped_ptr<AcceleratorManager> accelerator_manager_; 146 scoped_ptr<AcceleratorManager> accelerator_manager_;
145 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; 147 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
146 148
147 DISALLOW_COPY_AND_ASSIGN(WebActivityController); 149 DISALLOW_COPY_AND_ASSIGN(WebActivityController);
148 }; 150 };
149 151
150 const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); 152 const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2);
151 const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77); 153 const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77);
152 const int kIconSize = 32; 154 const int kIconSize = 32;
155 const int kDistanceShowReloadMessage = 100;
156 const int kDistanceReload = 150;
153 157
154 } // namespace 158 } // namespace
155 159
156 // A web view for athena's web activity. Note that AthenaWebView will create its 160 // A web view for athena's web activity. Note that AthenaWebView will create its
157 // own content so that it can eject and reload it. 161 // own content so that it can eject and reload it.
158 class AthenaWebView : public views::WebView { 162 class AthenaWebView : public views::WebView {
159 public: 163 public:
160 AthenaWebView(content::BrowserContext* context) 164 AthenaWebView(content::BrowserContext* context)
161 : views::WebView(context), controller_(new WebActivityController(this)), 165 : views::WebView(context), controller_(new WebActivityController(this)),
162 fullscreen_(false) { 166 fullscreen_(false),
167 overscroll_y_(0) {
163 SetEmbedFullscreenWidgetMode(true); 168 SetEmbedFullscreenWidgetMode(true);
164 // TODO(skuhne): Add content observer to detect renderer crash and set 169 // TODO(skuhne): Add content observer to detect renderer crash and set
165 // content status to unloaded if that happens. 170 // content status to unloaded if that happens.
166 } 171 }
167 172
168 AthenaWebView(content::WebContents* web_contents) 173 AthenaWebView(content::WebContents* web_contents)
169 : views::WebView(web_contents->GetBrowserContext()), 174 : views::WebView(web_contents->GetBrowserContext()),
170 controller_(new WebActivityController(this)) { 175 controller_(new WebActivityController(this)) {
171 scoped_ptr<content::WebContents> old_contents( 176 scoped_ptr<content::WebContents> old_contents(
172 SwapWebContents(scoped_ptr<content::WebContents>(web_contents))); 177 SwapWebContents(scoped_ptr<content::WebContents>(web_contents)));
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 // NULL is returned if the URL wasn't opened immediately. 246 // NULL is returned if the URL wasn't opened immediately.
242 return NULL; 247 return NULL;
243 } 248 }
244 249
245 virtual bool CanOverscrollContent() const OVERRIDE { 250 virtual bool CanOverscrollContent() const OVERRIDE {
246 const std::string value = CommandLine::ForCurrentProcess()-> 251 const std::string value = CommandLine::ForCurrentProcess()->
247 GetSwitchValueASCII(switches::kOverscrollHistoryNavigation); 252 GetSwitchValueASCII(switches::kOverscrollHistoryNavigation);
248 return value != "0"; 253 return value != "0";
249 } 254 }
250 255
256 virtual void OverscrollUpdate(int delta_y) OVERRIDE {
257 overscroll_y_ = delta_y;
258 if (overscroll_y_ > kDistanceShowReloadMessage) {
259 if (!reload_message_)
260 CreateReloadMessage();
261 reload_message_->Show();
262 float opacity = 1.0f;
263 if (overscroll_y_ < kDistanceReload) {
264 opacity =
265 (overscroll_y_ - kDistanceShowReloadMessage) /
266 static_cast<float>(kDistanceReload - kDistanceShowReloadMessage);
267 }
268 reload_message_->GetLayer()->SetOpacity(opacity);
oshima 2014/09/18 18:01:02 I wonder if we should animation opacity change.
pkotwicz 2014/09/18 18:47:28 We get gesture events often enough that I do not t
269 } else if (reload_message_) {
270 reload_message_->Hide();
271 }
272 }
273
274 virtual void OverscrollComplete() OVERRIDE {
275 if (overscroll_y_ >= kDistanceReload)
276 GetWebContents()->GetController().Reload(false);
277 if (reload_message_)
278 reload_message_->Hide();
279 overscroll_y_ = 0;
280 }
281
251 virtual void AddNewContents(content::WebContents* source, 282 virtual void AddNewContents(content::WebContents* source,
252 content::WebContents* new_contents, 283 content::WebContents* new_contents,
253 WindowOpenDisposition disposition, 284 WindowOpenDisposition disposition,
254 const gfx::Rect& initial_pos, 285 const gfx::Rect& initial_pos,
255 bool user_gesture, 286 bool user_gesture,
256 bool* was_blocked) OVERRIDE { 287 bool* was_blocked) OVERRIDE {
257 ActivityManager::Get()->AddActivity( 288 ActivityManager::Get()->AddActivity(
258 new WebActivity(new AthenaWebView(new_contents))); 289 new WebActivity(new AthenaWebView(new_contents)));
259 } 290 }
260 291
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 return athena::OpenFileChooser(web_contents, params); 356 return athena::OpenFileChooser(web_contents, params);
326 } 357 }
327 358
328 private: 359 private:
329 void CreateProgressBar() { 360 void CreateProgressBar() {
330 CHECK(!progress_bar_); 361 CHECK(!progress_bar_);
331 progress_bar_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); 362 progress_bar_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR));
332 progress_bar_->SetColor(SkColorSetRGB(0x17, 0x59, 0xcd)); 363 progress_bar_->SetColor(SkColorSetRGB(0x17, 0x59, 0xcd));
333 } 364 }
334 365
366 void CreateReloadMessage() {
367 CHECK(!reload_message_);
368 reload_message_.reset(new views::Widget);
369 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
370 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
371 params.parent = GetWidget()->GetNativeView();
372 reload_message_->Init(params);
373
374 views::Label* label = new views::Label(base::UTF8ToUTF16("Reload"));
oshima 2014/09/18 18:01:03 I think it's time to stop hard coding strings and
pkotwicz 2014/09/18 18:47:28 I will do this in a separate CL
375 label->SetBackgroundColor(SK_ColorGRAY);
376 label->set_background(
377 views::Background::CreateSolidBackground(SK_ColorGRAY));
378
379 reload_message_->SetContentsView(label);
380 reload_message_->SetBounds(ConvertRectToWidget(
381 gfx::Rect(0, 0, width(), label->GetPreferredSize().height())));
382 }
383
335 scoped_ptr<WebActivityController> controller_; 384 scoped_ptr<WebActivityController> controller_;
336 385
337 // If the activity got evicted, this is the web content which holds the known 386 // If the activity got evicted, this is the web content which holds the known
338 // state of the content before eviction. 387 // state of the content before eviction.
339 scoped_ptr<content::WebContents> evicted_web_contents_; 388 scoped_ptr<content::WebContents> evicted_web_contents_;
340 389
341 scoped_ptr<ui::Layer> progress_bar_; 390 scoped_ptr<ui::Layer> progress_bar_;
342 391
392 scoped_ptr<views::Widget> reload_message_;
393
343 // TODO(oshima): Find out if we should support window fullscreen. 394 // TODO(oshima): Find out if we should support window fullscreen.
344 // It may still useful when a user is in split mode. 395 // It may still useful when a user is in split mode.
345 bool fullscreen_; 396 bool fullscreen_;
346 397
398 // The distance that the user has overscrolled vertically.
399 int overscroll_y_;
400
347 DISALLOW_COPY_AND_ASSIGN(AthenaWebView); 401 DISALLOW_COPY_AND_ASSIGN(AthenaWebView);
348 }; 402 };
349 403
350 WebActivity::WebActivity(content::BrowserContext* browser_context, 404 WebActivity::WebActivity(content::BrowserContext* browser_context,
351 const base::string16& title, 405 const base::string16& title,
352 const GURL& url) 406 const GURL& url)
353 : browser_context_(browser_context), 407 : browser_context_(browser_context),
354 title_(title), 408 title_(title),
355 url_(url), 409 url_(url),
356 web_view_(NULL), 410 web_view_(NULL),
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 632
579 void WebActivity::ReloadAndObserve() { 633 void WebActivity::ReloadAndObserve() {
580 if (web_view_->IsContentEvicted()) { 634 if (web_view_->IsContentEvicted()) {
581 DCHECK_EQ(ACTIVITY_UNLOADED, current_state_); 635 DCHECK_EQ(ACTIVITY_UNLOADED, current_state_);
582 web_view_->ReloadContent(); 636 web_view_->ReloadContent();
583 } 637 }
584 Observe(web_view_->GetWebContents()); 638 Observe(web_view_->GetWebContents());
585 } 639 }
586 640
587 } // namespace athena 641 } // namespace athena
OLDNEW
« no previous file with comments | « no previous file | athena/main/athena_launcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698