summaryrefslogtreecommitdiff
path: root/athena/content/web_activity.cc
diff options
context:
space:
mode:
Diffstat (limited to 'athena/content/web_activity.cc')
-rw-r--r--athena/content/web_activity.cc150
1 files changed, 146 insertions, 4 deletions
diff --git a/athena/content/web_activity.cc b/athena/content/web_activity.cc
index fa7b6da241..0385b47460 100644
--- a/athena/content/web_activity.cc
+++ b/athena/content/web_activity.cc
@@ -5,11 +5,148 @@
#include "athena/content/web_activity.h"
#include "athena/activity/public/activity_manager.h"
-#include "base/strings/utf_string_conversions.h"
+#include "athena/input/public/accelerator_manager.h"
+#include "content/public/browser/native_web_keyboard_event.h"
#include "content/public/browser/web_contents.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"
namespace athena {
+namespace {
+
+class WebActivityController : public AcceleratorHandler {
+ public:
+ enum Command {
+ CMD_BACK,
+ CMD_FORWARD,
+ CMD_RELOAD,
+ CMD_RELOAD_IGNORE_CACHE,
+ };
+
+ explicit WebActivityController(views::WebView* web_view)
+ : web_view_(web_view), reserved_accelerator_enabled_(true) {}
+ virtual ~WebActivityController() {}
+
+ // Installs accelerators for web activity.
+ void InstallAccelerators() {
+ accelerator_manager_ = AcceleratorManager::CreateForFocusManager(
+ web_view_->GetFocusManager()).Pass();
+ const AcceleratorData accelerator_data[] = {
+ {TRIGGER_ON_PRESS, ui::VKEY_R, ui::EF_CONTROL_DOWN, CMD_RELOAD,
+ AF_NONE},
+ {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_REFRESH, ui::EF_NONE, CMD_RELOAD,
+ AF_NONE},
+ {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_REFRESH, ui::EF_CONTROL_DOWN,
+ CMD_RELOAD_IGNORE_CACHE, AF_NONE},
+ {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_FORWARD, ui::EF_NONE, CMD_FORWARD,
+ AF_NONE},
+ {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_BACK, ui::EF_NONE, CMD_BACK,
+ AF_NONE},
+ };
+ accelerator_manager_->RegisterAccelerators(
+ accelerator_data, arraysize(accelerator_data), this);
+ }
+
+ // Methods that are called before and after key events are consumed by the web
+ // contents.
+ // See the documentation in WebContentsDelegate: for more details.
+ bool PreHandleKeyboardEvent(content::WebContents* source,
+ const content::NativeWebKeyboardEvent& event,
+ bool* is_keyboard_shortcut) {
+ ui::Accelerator accelerator(
+ static_cast<ui::KeyboardCode>(event.windowsKeyCode),
+ content::GetModifiersFromNativeWebKeyboardEvent(event));
+ if (event.type == blink::WebInputEvent::KeyUp)
+ accelerator.set_type(ui::ET_KEY_RELEASED);
+
+ if (reserved_accelerator_enabled_ &&
+ accelerator_manager_->IsRegistered(accelerator, AF_RESERVED)) {
+ return web_view_->GetFocusManager()->ProcessAccelerator(accelerator);
+ }
+ *is_keyboard_shortcut =
+ accelerator_manager_->IsRegistered(accelerator, AF_NONE);
+ return false;
+ }
+
+ void HandleKeyboardEvent(content::WebContents* source,
+ const content::NativeWebKeyboardEvent& event) {
+ unhandled_keyboard_event_handler_.HandleKeyboardEvent(
+ event, web_view_->GetFocusManager());
+ }
+
+ private:
+ // AcceleratorHandler:
+ virtual bool IsCommandEnabled(int command_id) const OVERRIDE {
+ switch (command_id) {
+ case CMD_RELOAD:
+ return true;
+ case CMD_BACK:
+ return web_view_->GetWebContents()->GetController().CanGoBack();
+ case CMD_FORWARD:
+ return web_view_->GetWebContents()->GetController().CanGoForward();
+ }
+ return false;
+ }
+
+ virtual bool OnAcceleratorFired(int command_id,
+ const ui::Accelerator& accelerator) OVERRIDE {
+ switch (command_id) {
+ case CMD_RELOAD:
+ web_view_->GetWebContents()->GetController().Reload(false);
+ return true;
+ case CMD_RELOAD_IGNORE_CACHE:
+ web_view_->GetWebContents()->GetController().ReloadIgnoringCache(false);
+ return true;
+ case CMD_BACK:
+ web_view_->GetWebContents()->GetController().GoBack();
+ return true;
+ case CMD_FORWARD:
+ web_view_->GetWebContents()->GetController().GoForward();
+ return true;
+ }
+ return false;
+ }
+
+ views::WebView* web_view_;
+ bool reserved_accelerator_enabled_;
+ scoped_ptr<AcceleratorManager> accelerator_manager_;
+ views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebActivityController);
+};
+
+// A web view for athena's web activity.
+class AthenaWebView : public views::WebView {
+ public:
+ AthenaWebView(content::BrowserContext* context)
+ : views::WebView(context), controller_(new WebActivityController(this)) {}
+ virtual ~AthenaWebView() {}
+
+ void InstallAccelerators() { controller_->InstallAccelerators(); }
+
+ private:
+ // WebContentsDelegate:
+ virtual bool PreHandleKeyboardEvent(
+ content::WebContents* source,
+ const content::NativeWebKeyboardEvent& event,
+ bool* is_keyboard_shortcut) OVERRIDE {
+ return controller_->PreHandleKeyboardEvent(
+ source, event, is_keyboard_shortcut);
+ }
+
+ virtual void HandleKeyboardEvent(
+ content::WebContents* source,
+ const content::NativeWebKeyboardEvent& event) OVERRIDE {
+ controller_->HandleKeyboardEvent(source, event);
+ }
+
+ scoped_ptr<WebActivityController> controller_;
+
+ DISALLOW_COPY_AND_ASSIGN(AthenaWebView);
+};
+
+} // namespace
WebActivity::WebActivity(content::BrowserContext* browser_context,
const GURL& url)
@@ -23,18 +160,23 @@ ActivityViewModel* WebActivity::GetActivityViewModel() {
return this;
}
+void WebActivity::Init() {
+ DCHECK(web_view_);
+ static_cast<AthenaWebView*>(web_view_)->InstallAccelerators();
+}
+
SkColor WebActivity::GetRepresentativeColor() {
// TODO(sad): Compute the color from the favicon.
return SK_ColorGRAY;
}
-std::string WebActivity::GetTitle() {
- return base::UTF16ToUTF8(web_view_->GetWebContents()->GetTitle());
+base::string16 WebActivity::GetTitle() {
+ return web_view_->GetWebContents()->GetTitle();
}
views::View* WebActivity::GetContentsView() {
if (!web_view_) {
- web_view_ = new views::WebView(browser_context_);
+ web_view_ = new AthenaWebView(browser_context_);
web_view_->LoadInitialURL(url_);
Observe(web_view_->GetWebContents());
}