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/content_proxy.h" | 9 #include "athena/content/content_proxy.h" |
10 #include "athena/content/media_utils.h" | 10 #include "athena/content/media_utils.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 public: | 40 public: |
41 enum Command { | 41 enum Command { |
42 CMD_BACK, | 42 CMD_BACK, |
43 CMD_FORWARD, | 43 CMD_FORWARD, |
44 CMD_RELOAD, | 44 CMD_RELOAD, |
45 CMD_RELOAD_IGNORE_CACHE, | 45 CMD_RELOAD_IGNORE_CACHE, |
46 CMD_CLOSE, | 46 CMD_CLOSE, |
47 CMD_STOP, | 47 CMD_STOP, |
48 }; | 48 }; |
49 | 49 |
50 explicit WebActivityController(views::WebView* web_view) | 50 explicit WebActivityController(WebActivity* owner_activity, |
51 : web_view_(web_view), reserved_accelerator_enabled_(true) {} | 51 views::WebView* web_view) |
| 52 : owner_activity_(owner_activity), |
| 53 web_view_(web_view), |
| 54 reserved_accelerator_enabled_(true) {} |
52 virtual ~WebActivityController() {} | 55 virtual ~WebActivityController() {} |
53 | 56 |
54 // Installs accelerators for web activity. | 57 // Installs accelerators for web activity. |
55 void InstallAccelerators() { | 58 void InstallAccelerators() { |
56 accelerator_manager_ = AcceleratorManager::CreateForFocusManager( | 59 accelerator_manager_ = AcceleratorManager::CreateForFocusManager( |
57 web_view_->GetFocusManager()).Pass(); | 60 web_view_->GetFocusManager()).Pass(); |
58 const AcceleratorData accelerator_data[] = { | 61 const AcceleratorData accelerator_data[] = { |
59 {TRIGGER_ON_PRESS, ui::VKEY_R, ui::EF_CONTROL_DOWN, CMD_RELOAD, | 62 {TRIGGER_ON_PRESS, ui::VKEY_R, ui::EF_CONTROL_DOWN, CMD_RELOAD, |
60 AF_NONE}, | 63 AF_NONE}, |
61 {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_REFRESH, ui::EF_NONE, CMD_RELOAD, | 64 {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_REFRESH, ui::EF_NONE, CMD_RELOAD, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 case CMD_RELOAD_IGNORE_CACHE: | 132 case CMD_RELOAD_IGNORE_CACHE: |
130 web_view_->GetWebContents()->GetController().ReloadIgnoringCache(false); | 133 web_view_->GetWebContents()->GetController().ReloadIgnoringCache(false); |
131 return true; | 134 return true; |
132 case CMD_BACK: | 135 case CMD_BACK: |
133 web_view_->GetWebContents()->GetController().GoBack(); | 136 web_view_->GetWebContents()->GetController().GoBack(); |
134 return true; | 137 return true; |
135 case CMD_FORWARD: | 138 case CMD_FORWARD: |
136 web_view_->GetWebContents()->GetController().GoForward(); | 139 web_view_->GetWebContents()->GetController().GoForward(); |
137 return true; | 140 return true; |
138 case CMD_CLOSE: | 141 case CMD_CLOSE: |
139 web_view_->GetWidget()->Close(); | 142 Activity::Delete(owner_activity_); |
140 return true; | 143 return true; |
141 case CMD_STOP: | 144 case CMD_STOP: |
142 web_view_->GetWebContents()->Stop(); | 145 web_view_->GetWebContents()->Stop(); |
143 return true; | 146 return true; |
144 } | 147 } |
145 return false; | 148 return false; |
146 } | 149 } |
147 | 150 |
| 151 Activity* const owner_activity_; |
148 views::WebView* web_view_; | 152 views::WebView* web_view_; |
149 bool reserved_accelerator_enabled_; | 153 bool reserved_accelerator_enabled_; |
150 scoped_ptr<AcceleratorManager> accelerator_manager_; | 154 scoped_ptr<AcceleratorManager> accelerator_manager_; |
151 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; | 155 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; |
152 | 156 |
153 DISALLOW_COPY_AND_ASSIGN(WebActivityController); | 157 DISALLOW_COPY_AND_ASSIGN(WebActivityController); |
154 }; | 158 }; |
155 | 159 |
156 const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); | 160 const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); |
157 const int kIconSize = 32; | 161 const int kIconSize = 32; |
158 const float kDistanceShowReloadMessage = 100; | 162 const float kDistanceShowReloadMessage = 100; |
159 const float kDistanceReload = 150; | 163 const float kDistanceReload = 150; |
160 | 164 |
161 } // namespace | 165 } // namespace |
162 | 166 |
163 // A web view for athena's web activity. Note that AthenaWebView will create its | 167 // A web view for athena's web activity. Note that AthenaWebView will create its |
164 // own content so that it can eject and reload it. | 168 // own content so that it can eject and reload it. |
165 class AthenaWebView : public views::WebView { | 169 class AthenaWebView : public views::WebView { |
166 public: | 170 public: |
167 explicit AthenaWebView(content::BrowserContext* context) | 171 explicit AthenaWebView(content::BrowserContext* context, |
| 172 WebActivity* owner_activity) |
168 : views::WebView(context), | 173 : views::WebView(context), |
169 controller_(new WebActivityController(this)), | 174 controller_(new WebActivityController(owner_activity, this)), |
| 175 owner_activity_(owner_activity), |
170 fullscreen_(false), | 176 fullscreen_(false), |
171 overscroll_y_(0) { | 177 overscroll_y_(0) { |
172 SetEmbedFullscreenWidgetMode(true); | 178 SetEmbedFullscreenWidgetMode(true); |
173 // TODO(skuhne): Add content observer to detect renderer crash and set | 179 // TODO(skuhne): Add content observer to detect renderer crash and set |
174 // content status to unloaded if that happens. | 180 // content status to unloaded if that happens. |
175 } | 181 } |
176 | 182 |
177 AthenaWebView(content::WebContents* web_contents) | 183 AthenaWebView(content::WebContents* web_contents, |
| 184 WebActivity* owner_activity) |
178 : views::WebView(web_contents->GetBrowserContext()), | 185 : views::WebView(web_contents->GetBrowserContext()), |
179 controller_(new WebActivityController(this)) { | 186 controller_(new WebActivityController(owner_activity, this)), |
| 187 owner_activity_(owner_activity) { |
180 scoped_ptr<content::WebContents> old_contents( | 188 scoped_ptr<content::WebContents> old_contents( |
181 SwapWebContents(scoped_ptr<content::WebContents>(web_contents))); | 189 SwapWebContents(scoped_ptr<content::WebContents>(web_contents))); |
182 } | 190 } |
183 | 191 |
184 virtual ~AthenaWebView() {} | 192 virtual ~AthenaWebView() {} |
185 | 193 |
186 void InstallAccelerators() { controller_->InstallAccelerators(); } | 194 void InstallAccelerators() { controller_->InstallAccelerators(); } |
187 | 195 |
188 void EvictContent() { | 196 void EvictContent() { |
189 scoped_ptr<content::WebContents> old_contents(SwapWebContents( | 197 scoped_ptr<content::WebContents> old_contents(SwapWebContents( |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 return athena::OpenColorChooser(web_contents, color, suggestions); | 371 return athena::OpenColorChooser(web_contents, color, suggestions); |
364 } | 372 } |
365 | 373 |
366 // Called when a file selection is to be done. | 374 // Called when a file selection is to be done. |
367 virtual void RunFileChooser( | 375 virtual void RunFileChooser( |
368 content::WebContents* web_contents, | 376 content::WebContents* web_contents, |
369 const content::FileChooserParams& params) override { | 377 const content::FileChooserParams& params) override { |
370 return athena::OpenFileChooser(web_contents, params); | 378 return athena::OpenFileChooser(web_contents, params); |
371 } | 379 } |
372 | 380 |
| 381 virtual void CloseContents(content::WebContents* contents) override { |
| 382 Activity::Delete(owner_activity_); |
| 383 } |
| 384 |
373 private: | 385 private: |
374 void CreateProgressBar() { | 386 void CreateProgressBar() { |
375 CHECK(!progress_bar_); | 387 CHECK(!progress_bar_); |
376 progress_bar_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); | 388 progress_bar_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); |
377 progress_bar_->SetColor(SkColorSetRGB(0x17, 0x59, 0xcd)); | 389 progress_bar_->SetColor(SkColorSetRGB(0x17, 0x59, 0xcd)); |
378 } | 390 } |
379 | 391 |
380 void CreateReloadMessage() { | 392 void CreateReloadMessage() { |
381 CHECK(!reload_message_); | 393 CHECK(!reload_message_); |
382 reload_message_.reset(new views::Widget); | 394 reload_message_.reset(new views::Widget); |
383 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); | 395 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); |
384 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 396 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
385 params.parent = GetWidget()->GetNativeView(); | 397 params.parent = GetWidget()->GetNativeView(); |
386 reload_message_->Init(params); | 398 reload_message_->Init(params); |
387 | 399 |
388 views::Label* label = new views::Label( | 400 views::Label* label = new views::Label( |
389 l10n_util::GetStringUTF16(IDS_ATHENA_PULL_TO_RELOAD_MESSAGE)); | 401 l10n_util::GetStringUTF16(IDS_ATHENA_PULL_TO_RELOAD_MESSAGE)); |
390 label->SetBackgroundColor(SK_ColorGRAY); | 402 label->SetBackgroundColor(SK_ColorGRAY); |
391 label->set_background( | 403 label->set_background( |
392 views::Background::CreateSolidBackground(SK_ColorGRAY)); | 404 views::Background::CreateSolidBackground(SK_ColorGRAY)); |
393 | 405 |
394 reload_message_->SetContentsView(label); | 406 reload_message_->SetContentsView(label); |
395 reload_message_->SetBounds(ConvertRectToWidget( | 407 reload_message_->SetBounds(ConvertRectToWidget( |
396 gfx::Rect(0, 0, width(), label->GetPreferredSize().height()))); | 408 gfx::Rect(0, 0, width(), label->GetPreferredSize().height()))); |
397 } | 409 } |
398 | 410 |
399 scoped_ptr<WebActivityController> controller_; | 411 scoped_ptr<WebActivityController> controller_; |
400 | 412 |
| 413 Activity* const owner_activity_; |
| 414 |
401 // If the activity got evicted, this is the web content which holds the known | 415 // If the activity got evicted, this is the web content which holds the known |
402 // state of the content before eviction. | 416 // state of the content before eviction. |
403 scoped_ptr<content::WebContents> evicted_web_contents_; | 417 scoped_ptr<content::WebContents> evicted_web_contents_; |
404 | 418 |
405 scoped_ptr<ui::Layer> progress_bar_; | 419 scoped_ptr<ui::Layer> progress_bar_; |
406 | 420 |
407 scoped_ptr<views::Widget> reload_message_; | 421 scoped_ptr<views::Widget> reload_message_; |
408 | 422 |
409 // TODO(oshima): Find out if we should support window fullscreen. | 423 // TODO(oshima): Find out if we should support window fullscreen. |
410 // It may still useful when a user is in split mode. | 424 // It may still useful when a user is in split mode. |
411 bool fullscreen_; | 425 bool fullscreen_; |
412 | 426 |
413 // The distance that the user has overscrolled vertically. | 427 // The distance that the user has overscrolled vertically. |
414 float overscroll_y_; | 428 float overscroll_y_; |
415 | 429 |
416 DISALLOW_COPY_AND_ASSIGN(AthenaWebView); | 430 DISALLOW_COPY_AND_ASSIGN(AthenaWebView); |
417 }; | 431 }; |
418 | 432 |
419 WebActivity::WebActivity(content::BrowserContext* browser_context, | 433 WebActivity::WebActivity(content::BrowserContext* browser_context, |
420 const base::string16& title, | 434 const base::string16& title, |
421 const GURL& url) | 435 const GURL& url) |
422 : browser_context_(browser_context), | 436 : browser_context_(browser_context), |
423 web_view_(new AthenaWebView(browser_context)), | 437 web_view_(new AthenaWebView(browser_context, this)), |
424 title_(title), | 438 title_(title), |
425 title_color_(kDefaultTitleColor), | 439 title_color_(kDefaultTitleColor), |
426 current_state_(ACTIVITY_UNLOADED), | 440 current_state_(ACTIVITY_UNLOADED), |
427 weak_ptr_factory_(this) { | 441 weak_ptr_factory_(this) { |
428 // Order is important. The web activity helpers must be attached prior to the | 442 // Order is important. The web activity helpers must be attached prior to the |
429 // RenderView being created. | 443 // RenderView being created. |
430 SetCurrentState(ACTIVITY_INVISIBLE); | 444 SetCurrentState(ACTIVITY_INVISIBLE); |
431 web_view_->LoadInitialURL(url); | 445 web_view_->LoadInitialURL(url); |
432 } | 446 } |
433 | 447 |
434 WebActivity::WebActivity(content::WebContents* contents) | 448 WebActivity::WebActivity(content::WebContents* contents) |
435 : browser_context_(contents->GetBrowserContext()), | 449 : browser_context_(contents->GetBrowserContext()), |
436 web_view_(new AthenaWebView(contents)), | 450 web_view_(new AthenaWebView(contents, this)), |
437 title_color_(kDefaultTitleColor), | 451 title_color_(kDefaultTitleColor), |
438 current_state_(ACTIVITY_UNLOADED), | 452 current_state_(ACTIVITY_UNLOADED), |
439 weak_ptr_factory_(this) { | 453 weak_ptr_factory_(this) { |
440 // If the activity was created as a result of | 454 // If the activity was created as a result of |
441 // WebContentsDelegate::AddNewContents(), web activity helpers may not be | 455 // WebContentsDelegate::AddNewContents(), web activity helpers may not be |
442 // created prior to the RenderView being created. Desktop Chrome has a | 456 // created prior to the RenderView being created. Desktop Chrome has a |
443 // similar problem. | 457 // similar problem. |
444 SetCurrentState(ACTIVITY_INVISIBLE); | 458 SetCurrentState(ACTIVITY_INVISIBLE); |
445 } | 459 } |
446 | 460 |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 if (content_proxy_.get()) | 641 if (content_proxy_.get()) |
628 content_proxy_.reset(NULL); | 642 content_proxy_.reset(NULL); |
629 } | 643 } |
630 | 644 |
631 void WebActivity::ShowContentProxy() { | 645 void WebActivity::ShowContentProxy() { |
632 if (!content_proxy_.get()) | 646 if (!content_proxy_.get()) |
633 content_proxy_.reset(new ContentProxy(web_view_)); | 647 content_proxy_.reset(new ContentProxy(web_view_)); |
634 } | 648 } |
635 | 649 |
636 } // namespace athena | 650 } // namespace athena |
OLD | NEW |