| Index: athena/content/web_activity.cc
|
| diff --git a/athena/content/web_activity.cc b/athena/content/web_activity.cc
|
| index 97020f6c57334ee4dfd6fa33cab75b0a915bd73c..0385b47460f797f543e033690cf7167da9d038b9 100644
|
| --- a/athena/content/web_activity.cc
|
| +++ b/athena/content/web_activity.cc
|
| @@ -5,10 +5,148 @@
|
| #include "athena/content/web_activity.h"
|
|
|
| #include "athena/activity/public/activity_manager.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)
|
| @@ -22,6 +160,11 @@ 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;
|
| @@ -33,7 +176,7 @@ base::string16 WebActivity::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());
|
| }
|
|
|