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_manager.h" | 7 #include "athena/activity/public/activity_manager.h" |
| 8 #include "athena/input/public/accelerator_manager.h" |
| 9 #include "content/public/browser/native_web_keyboard_event.h" |
8 #include "content/public/browser/web_contents.h" | 10 #include "content/public/browser/web_contents.h" |
| 11 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" |
9 #include "ui/views/controls/webview/webview.h" | 12 #include "ui/views/controls/webview/webview.h" |
| 13 #include "ui/views/focus/focus_manager.h" |
10 | 14 |
11 namespace athena { | 15 namespace athena { |
| 16 namespace { |
| 17 |
| 18 class WebActivityController : public AcceleratorHandler { |
| 19 public: |
| 20 enum Command { |
| 21 CMD_BACK, |
| 22 CMD_FORWARD, |
| 23 CMD_RELOAD, |
| 24 CMD_RELOAD_IGNORE_CACHE, |
| 25 }; |
| 26 |
| 27 explicit WebActivityController(views::WebView* web_view) |
| 28 : web_view_(web_view), reserved_accelerator_enabled_(true) {} |
| 29 virtual ~WebActivityController() {} |
| 30 |
| 31 // Installs accelerators for web activity. |
| 32 void InstallAccelerators() { |
| 33 accelerator_manager_ = AcceleratorManager::CreateForFocusManager( |
| 34 web_view_->GetFocusManager()).Pass(); |
| 35 const AcceleratorData accelerator_data[] = { |
| 36 {TRIGGER_ON_PRESS, ui::VKEY_R, ui::EF_CONTROL_DOWN, CMD_RELOAD, |
| 37 AF_NONE}, |
| 38 {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_REFRESH, ui::EF_NONE, CMD_RELOAD, |
| 39 AF_NONE}, |
| 40 {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_REFRESH, ui::EF_CONTROL_DOWN, |
| 41 CMD_RELOAD_IGNORE_CACHE, AF_NONE}, |
| 42 {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_FORWARD, ui::EF_NONE, CMD_FORWARD, |
| 43 AF_NONE}, |
| 44 {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_BACK, ui::EF_NONE, CMD_BACK, |
| 45 AF_NONE}, |
| 46 }; |
| 47 accelerator_manager_->RegisterAccelerators( |
| 48 accelerator_data, arraysize(accelerator_data), this); |
| 49 } |
| 50 |
| 51 // Methods that are called before and after key events are consumed by the web |
| 52 // contents. |
| 53 // See the documentation in WebContentsDelegate: for more details. |
| 54 bool PreHandleKeyboardEvent(content::WebContents* source, |
| 55 const content::NativeWebKeyboardEvent& event, |
| 56 bool* is_keyboard_shortcut) { |
| 57 ui::Accelerator accelerator( |
| 58 static_cast<ui::KeyboardCode>(event.windowsKeyCode), |
| 59 content::GetModifiersFromNativeWebKeyboardEvent(event)); |
| 60 if (event.type == blink::WebInputEvent::KeyUp) |
| 61 accelerator.set_type(ui::ET_KEY_RELEASED); |
| 62 |
| 63 if (reserved_accelerator_enabled_ && |
| 64 accelerator_manager_->IsRegistered(accelerator, AF_RESERVED)) { |
| 65 return web_view_->GetFocusManager()->ProcessAccelerator(accelerator); |
| 66 } |
| 67 *is_keyboard_shortcut = |
| 68 accelerator_manager_->IsRegistered(accelerator, AF_NONE); |
| 69 return false; |
| 70 } |
| 71 |
| 72 void HandleKeyboardEvent(content::WebContents* source, |
| 73 const content::NativeWebKeyboardEvent& event) { |
| 74 unhandled_keyboard_event_handler_.HandleKeyboardEvent( |
| 75 event, web_view_->GetFocusManager()); |
| 76 } |
| 77 |
| 78 private: |
| 79 // AcceleratorHandler: |
| 80 virtual bool IsCommandEnabled(int command_id) const OVERRIDE { |
| 81 switch (command_id) { |
| 82 case CMD_RELOAD: |
| 83 return true; |
| 84 case CMD_BACK: |
| 85 return web_view_->GetWebContents()->GetController().CanGoBack(); |
| 86 case CMD_FORWARD: |
| 87 return web_view_->GetWebContents()->GetController().CanGoForward(); |
| 88 } |
| 89 return false; |
| 90 } |
| 91 |
| 92 virtual bool OnAcceleratorFired(int command_id, |
| 93 const ui::Accelerator& accelerator) OVERRIDE { |
| 94 switch (command_id) { |
| 95 case CMD_RELOAD: |
| 96 web_view_->GetWebContents()->GetController().Reload(false); |
| 97 return true; |
| 98 case CMD_RELOAD_IGNORE_CACHE: |
| 99 web_view_->GetWebContents()->GetController().ReloadIgnoringCache(false); |
| 100 return true; |
| 101 case CMD_BACK: |
| 102 web_view_->GetWebContents()->GetController().GoBack(); |
| 103 return true; |
| 104 case CMD_FORWARD: |
| 105 web_view_->GetWebContents()->GetController().GoForward(); |
| 106 return true; |
| 107 } |
| 108 return false; |
| 109 } |
| 110 |
| 111 views::WebView* web_view_; |
| 112 bool reserved_accelerator_enabled_; |
| 113 scoped_ptr<AcceleratorManager> accelerator_manager_; |
| 114 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; |
| 115 |
| 116 DISALLOW_COPY_AND_ASSIGN(WebActivityController); |
| 117 }; |
| 118 |
| 119 // A web view for athena's web activity. |
| 120 class AthenaWebView : public views::WebView { |
| 121 public: |
| 122 AthenaWebView(content::BrowserContext* context) |
| 123 : views::WebView(context), controller_(new WebActivityController(this)) {} |
| 124 virtual ~AthenaWebView() {} |
| 125 |
| 126 void InstallAccelerators() { controller_->InstallAccelerators(); } |
| 127 |
| 128 private: |
| 129 // WebContentsDelegate: |
| 130 virtual bool PreHandleKeyboardEvent( |
| 131 content::WebContents* source, |
| 132 const content::NativeWebKeyboardEvent& event, |
| 133 bool* is_keyboard_shortcut) OVERRIDE { |
| 134 return controller_->PreHandleKeyboardEvent( |
| 135 source, event, is_keyboard_shortcut); |
| 136 } |
| 137 |
| 138 virtual void HandleKeyboardEvent( |
| 139 content::WebContents* source, |
| 140 const content::NativeWebKeyboardEvent& event) OVERRIDE { |
| 141 controller_->HandleKeyboardEvent(source, event); |
| 142 } |
| 143 |
| 144 scoped_ptr<WebActivityController> controller_; |
| 145 |
| 146 DISALLOW_COPY_AND_ASSIGN(AthenaWebView); |
| 147 }; |
| 148 |
| 149 } // namespace |
12 | 150 |
13 WebActivity::WebActivity(content::BrowserContext* browser_context, | 151 WebActivity::WebActivity(content::BrowserContext* browser_context, |
14 const GURL& url) | 152 const GURL& url) |
15 : browser_context_(browser_context), url_(url), web_view_(NULL) { | 153 : browser_context_(browser_context), url_(url), web_view_(NULL) { |
16 } | 154 } |
17 | 155 |
18 WebActivity::~WebActivity() { | 156 WebActivity::~WebActivity() { |
19 } | 157 } |
20 | 158 |
21 ActivityViewModel* WebActivity::GetActivityViewModel() { | 159 ActivityViewModel* WebActivity::GetActivityViewModel() { |
22 return this; | 160 return this; |
23 } | 161 } |
24 | 162 |
| 163 void WebActivity::Init() { |
| 164 DCHECK(web_view_); |
| 165 static_cast<AthenaWebView*>(web_view_)->InstallAccelerators(); |
| 166 } |
| 167 |
25 SkColor WebActivity::GetRepresentativeColor() { | 168 SkColor WebActivity::GetRepresentativeColor() { |
26 // TODO(sad): Compute the color from the favicon. | 169 // TODO(sad): Compute the color from the favicon. |
27 return SK_ColorGRAY; | 170 return SK_ColorGRAY; |
28 } | 171 } |
29 | 172 |
30 base::string16 WebActivity::GetTitle() { | 173 base::string16 WebActivity::GetTitle() { |
31 return web_view_->GetWebContents()->GetTitle(); | 174 return web_view_->GetWebContents()->GetTitle(); |
32 } | 175 } |
33 | 176 |
34 views::View* WebActivity::GetContentsView() { | 177 views::View* WebActivity::GetContentsView() { |
35 if (!web_view_) { | 178 if (!web_view_) { |
36 web_view_ = new views::WebView(browser_context_); | 179 web_view_ = new AthenaWebView(browser_context_); |
37 web_view_->LoadInitialURL(url_); | 180 web_view_->LoadInitialURL(url_); |
38 Observe(web_view_->GetWebContents()); | 181 Observe(web_view_->GetWebContents()); |
39 } | 182 } |
40 return web_view_; | 183 return web_view_; |
41 } | 184 } |
42 | 185 |
43 void WebActivity::TitleWasSet(content::NavigationEntry* entry, | 186 void WebActivity::TitleWasSet(content::NavigationEntry* entry, |
44 bool explicit_set) { | 187 bool explicit_set) { |
45 ActivityManager::Get()->UpdateActivity(this); | 188 ActivityManager::Get()->UpdateActivity(this); |
46 } | 189 } |
47 | 190 |
48 void WebActivity::DidUpdateFaviconURL( | 191 void WebActivity::DidUpdateFaviconURL( |
49 const std::vector<content::FaviconURL>& candidates) { | 192 const std::vector<content::FaviconURL>& candidates) { |
50 ActivityManager::Get()->UpdateActivity(this); | 193 ActivityManager::Get()->UpdateActivity(this); |
51 } | 194 } |
52 | 195 |
53 } // namespace athena | 196 } // namespace athena |
OLD | NEW |