146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "athena/content/web_activity.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "athena/activity/public/activity_factory.h" 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "athena/activity/public/activity_manager.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/content/content_proxy.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/content/public/dialogs.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "athena/input/public/accelerator_manager.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/strings/grit/athena_strings.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/command_line.h" 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/favicon_base/select_favicon_frames.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/web_contents.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/common/content_switches.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/common/favicon_url.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/window.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/l10n/l10n_util.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/compositor/closure_animation_observer.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/compositor/scoped_layer_animation_settings.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/background.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/label.h" 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/views/controls/webview/webview.h" 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/views/focus/focus_manager.h" 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/views/widget/widget.h" 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace athena { 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class WebActivityController : public AcceleratorHandler { 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) enum Command { 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CMD_BACK, 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CMD_FORWARD, 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CMD_RELOAD, 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CMD_RELOAD_IGNORE_CACHE, 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMD_CLOSE, 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMD_STOP, 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) explicit WebActivityController(views::WebView* web_view) 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : web_view_(web_view), reserved_accelerator_enabled_(true) {} 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~WebActivityController() {} 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Installs accelerators for web activity. 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InstallAccelerators() { 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_manager_ = AcceleratorManager::CreateForFocusManager( 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_view_->GetFocusManager()).Pass(); 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const AcceleratorData accelerator_data[] = { 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_R, ui::EF_CONTROL_DOWN, CMD_RELOAD, 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AF_NONE}, 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_REFRESH, ui::EF_NONE, CMD_RELOAD, 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AF_NONE}, 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_REFRESH, ui::EF_CONTROL_DOWN, 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CMD_RELOAD_IGNORE_CACHE, AF_NONE}, 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_FORWARD, ui::EF_NONE, CMD_FORWARD, 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AF_NONE}, 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_BACK, ui::EF_NONE, CMD_BACK, 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AF_NONE}, 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {TRIGGER_ON_PRESS, ui::VKEY_W, ui::EF_CONTROL_DOWN, CMD_CLOSE, AF_NONE}, 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {TRIGGER_ON_PRESS, ui::VKEY_ESCAPE, ui::EF_NONE, CMD_STOP, AF_NONE}, 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_manager_->RegisterAccelerators( 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_data, arraysize(accelerator_data), this); 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Methods that are called before and after key events are consumed by the web 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // contents. 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // See the documentation in WebContentsDelegate: for more details. 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool PreHandleKeyboardEvent(content::WebContents* source, 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const content::NativeWebKeyboardEvent& event, 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool* is_keyboard_shortcut) { 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::Accelerator accelerator( 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static_cast<ui::KeyboardCode>(event.windowsKeyCode), 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::GetModifiersFromNativeWebKeyboardEvent(event)); 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (event.type == blink::WebInputEvent::KeyUp) 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator.set_type(ui::ET_KEY_RELEASED); 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (reserved_accelerator_enabled_ && 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_manager_->IsRegistered(accelerator, AF_RESERVED)) { 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return web_view_->GetFocusManager()->ProcessAccelerator(accelerator); 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *is_keyboard_shortcut = 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_manager_->IsRegistered(accelerator, AF_NONE); 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void HandleKeyboardEvent(content::WebContents* source, 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const content::NativeWebKeyboardEvent& event) { 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unhandled_keyboard_event_handler_.HandleKeyboardEvent( 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) event, web_view_->GetFocusManager()); 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // AcceleratorHandler: 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool IsCommandEnabled(int command_id) const OVERRIDE { 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (command_id) { 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_RELOAD: 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case CMD_RELOAD_IGNORE_CACHE: 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_BACK: 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return web_view_->GetWebContents()->GetController().CanGoBack(); 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_FORWARD: 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return web_view_->GetWebContents()->GetController().CanGoForward(); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case CMD_CLOSE: 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(oshima): check onbeforeunload handler. 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case CMD_STOP: 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return web_view_->GetWebContents()->IsLoading(); 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool OnAcceleratorFired(int command_id, 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ui::Accelerator& accelerator) OVERRIDE { 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (command_id) { 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_RELOAD: 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_view_->GetWebContents()->GetController().Reload(false); 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_RELOAD_IGNORE_CACHE: 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_view_->GetWebContents()->GetController().ReloadIgnoringCache(false); 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_BACK: 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_view_->GetWebContents()->GetController().GoBack(); 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_FORWARD: 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_view_->GetWebContents()->GetController().GoForward(); 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case CMD_CLOSE: 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_->GetWidget()->Close(); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case CMD_STOP: 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_->GetWebContents()->Stop(); 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) views::WebView* web_view_; 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool reserved_accelerator_enabled_; 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<AcceleratorManager> accelerator_manager_; 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebActivityController); 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77); 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kIconSize = 32; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kDistanceShowReloadMessage = 100; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kDistanceReload = 150; 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A web view for athena's web activity. Note that AthenaWebView will create its 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// own content so that it can eject and reload it. 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class AthenaWebView : public views::WebView { 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AthenaWebView(content::BrowserContext* context) 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : views::WebView(context), controller_(new WebActivityController(this)), 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fullscreen_(false), 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci overscroll_y_(0) { 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetEmbedFullscreenWidgetMode(true); 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(skuhne): Add content observer to detect renderer crash and set 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // content status to unloaded if that happens. 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AthenaWebView(content::WebContents* web_contents) 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : views::WebView(web_contents->GetBrowserContext()), 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) controller_(new WebActivityController(this)) { 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<content::WebContents> old_contents( 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SwapWebContents(scoped_ptr<content::WebContents>(web_contents))); 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~AthenaWebView() {} 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InstallAccelerators() { controller_->InstallAccelerators(); } 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void EvictContent() { 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<content::WebContents> old_contents(SwapWebContents( 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<content::WebContents>(content::WebContents::Create( 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents::CreateParams(browser_context()))))); 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If there is a progress bar, we need to get rid of it now since its 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // associated content, parent window and layers will disappear with evicting 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the content. 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci progress_bar_.reset(); 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch evicted_web_contents_.reset( 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents::Create(content::WebContents::CreateParams( 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch old_contents->GetBrowserContext()))); 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch evicted_web_contents_->GetController().CopyStateFrom( 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch old_contents->GetController()); 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // As soon as the new contents becomes visible, it should reload. 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(skuhne): This breaks script connections with other activities. 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Even though this is the same technique as used by the TabStripModel, 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // we might want to address this cleaner since we are more likely to 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // run into this state. by unloading. 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void ReloadContent() { 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(evicted_web_contents_.get()); 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<content::WebContents> replaced_contents(SwapWebContents( 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) evicted_web_contents_.Pass())); 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Check if the content got evicted. 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const bool IsContentEvicted() { return !!evicted_web_contents_.get(); } 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // content::WebContentsDelegate: 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual content::WebContents* OpenURLFromTab( 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* source, 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const content::OpenURLParams& params) OVERRIDE { 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) switch(params.disposition) { 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case CURRENT_TAB: { 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(source == web_contents()); 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::NavigationController::LoadURLParams load_url_params( 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.url); 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) load_url_params.referrer = params.referrer; 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) load_url_params.frame_tree_node_id = params.frame_tree_node_id; 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) load_url_params.transition_type = params.transition; 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) load_url_params.extra_headers = params.extra_headers; 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) load_url_params.should_replace_current_entry = 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.should_replace_current_entry; 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) load_url_params.is_renderer_initiated = params.is_renderer_initiated; 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) load_url_params.transferred_global_request_id = 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.transferred_global_request_id; 2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) web_contents()->GetController().LoadURLWithParams(load_url_params); 2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return web_contents(); 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case NEW_FOREGROUND_TAB: 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case NEW_BACKGROUND_TAB: 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case NEW_POPUP: 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case NEW_WINDOW: { 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Activity* activity = ActivityFactory::Get()->CreateWebActivity( 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_context(), base::string16(), params.url); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Activity::Show(activity); 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) default: 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // NULL is returned if the URL wasn't opened immediately. 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return NULL; 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool CanOverscrollContent() const OVERRIDE { 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string value = CommandLine::ForCurrentProcess()-> 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetSwitchValueASCII(switches::kOverscrollHistoryNavigation); 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return value != "0"; 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OverscrollUpdate(int delta_y) OVERRIDE { 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci overscroll_y_ = delta_y; 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (overscroll_y_ > kDistanceShowReloadMessage) { 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!reload_message_) 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateReloadMessage(); 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reload_message_->Show(); 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float opacity = 1.0f; 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (overscroll_y_ < kDistanceReload) { 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci opacity = 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (overscroll_y_ - kDistanceShowReloadMessage) / 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<float>(kDistanceReload - kDistanceShowReloadMessage); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reload_message_->GetLayer()->SetOpacity(opacity); 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if (reload_message_) { 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reload_message_->Hide(); 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OverscrollComplete() OVERRIDE { 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (overscroll_y_ >= kDistanceReload) 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetWebContents()->GetController().Reload(false); 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (reload_message_) 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reload_message_->Hide(); 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci overscroll_y_ = 0; 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void AddNewContents(content::WebContents* source, 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* new_contents, 2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WindowOpenDisposition disposition, 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::Rect& initial_pos, 2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool user_gesture, 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool* was_blocked) OVERRIDE { 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(oshima): Use factory. 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ActivityManager::Get()->AddActivity( 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new WebActivity(new AthenaWebView(new_contents))); 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool PreHandleKeyboardEvent( 296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::WebContents* source, 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const content::NativeWebKeyboardEvent& event, 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool* is_keyboard_shortcut) OVERRIDE { 299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return controller_->PreHandleKeyboardEvent( 300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) source, event, is_keyboard_shortcut); 301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void HandleKeyboardEvent( 304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::WebContents* source, 305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const content::NativeWebKeyboardEvent& event) OVERRIDE { 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) controller_->HandleKeyboardEvent(source, event); 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void ToggleFullscreenModeForTab(content::WebContents* web_contents, 3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool enter_fullscreen) OVERRIDE { 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) fullscreen_ = enter_fullscreen; 3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetWidget()->SetFullscreen(fullscreen_); 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool IsFullscreenForTabOrPending( 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const content::WebContents* web_contents) const OVERRIDE { 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return fullscreen_; 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void LoadingStateChanged(content::WebContents* source, 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool to_different_document) OVERRIDE { 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_stopped = source == NULL || !source->IsLoading(); 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LoadProgressChanged(source, has_stopped ? 1 : 0); 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void LoadProgressChanged(content::WebContents* source, 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci double progress) OVERRIDE { 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!progress) 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!progress_bar_) { 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateProgressBar(); 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci source->GetNativeView()->layer()->Add(progress_bar_.get()); 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci progress_bar_->SetBounds(gfx::Rect( 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 0, progress * progress_bar_->parent()->bounds().width(), 3)); 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (progress < 1) 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedLayerAnimationSettings settings(progress_bar_->GetAnimator()); 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci settings.SetTweenType(gfx::Tween::EASE_IN); 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::Layer* layer = progress_bar_.get(); 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci settings.AddObserver(new ui::ClosureAnimationObserver( 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&base::DeletePointer<ui::Layer>, progress_bar_.release()))); 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer->SetOpacity(0.f); 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual content::ColorChooser* OpenColorChooser( 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* web_contents, 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SkColor color, 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<content::ColorSuggestion>& suggestions) OVERRIDE { 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return athena::OpenColorChooser(web_contents, color, suggestions); 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called when a file selection is to be done. 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RunFileChooser( 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* web_contents, 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const content::FileChooserParams& params) OVERRIDE { 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return athena::OpenFileChooser(web_contents, params); 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void CreateProgressBar() { 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(!progress_bar_); 3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci progress_bar_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci progress_bar_->SetColor(SkColorSetRGB(0x17, 0x59, 0xcd)); 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void CreateReloadMessage() { 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(!reload_message_); 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reload_message_.reset(new views::Widget); 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.parent = GetWidget()->GetNativeView(); 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reload_message_->Init(params); 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::Label* label = new views::Label( 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci l10n_util::GetStringUTF16(IDS_ATHENA_PULL_TO_RELOAD_MESSAGE)); 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label->SetBackgroundColor(SK_ColorGRAY); 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label->set_background( 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::Background::CreateSolidBackground(SK_ColorGRAY)); 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reload_message_->SetContentsView(label); 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reload_message_->SetBounds(ConvertRectToWidget( 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect(0, 0, width(), label->GetPreferredSize().height()))); 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<WebActivityController> controller_; 389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If the activity got evicted, this is the web content which holds the known 391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // state of the content before eviction. 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<content::WebContents> evicted_web_contents_; 393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ui::Layer> progress_bar_; 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<views::Widget> reload_message_; 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(oshima): Find out if we should support window fullscreen. 3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // It may still useful when a user is in split mode. 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool fullscreen_; 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The distance that the user has overscrolled vertically. 4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int overscroll_y_; 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AthenaWebView); 406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)WebActivity::WebActivity(content::BrowserContext* browser_context, 4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::string16& title, 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GURL& url) 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : browser_context_(browser_context), 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci title_(title), 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_(url), 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_view_(NULL), 4156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) title_color_(kDefaultTitleColor), 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_state_(ACTIVITY_UNLOADED), 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_ptr_factory_(this) { 41846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)WebActivity::WebActivity(AthenaWebView* web_view) 4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : browser_context_(web_view->browser_context()), 4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url_(web_view->GetWebContents()->GetURL()), 4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) web_view_(web_view), 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_state_(ACTIVITY_UNLOADED), 4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_ptr_factory_(this) { 4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Transition to state ACTIVITY_INVISIBLE to perform the same setup steps 4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // as on new activities (namely adding a WebContentsObserver). 4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetCurrentState(ACTIVITY_INVISIBLE); 4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)WebActivity::~WebActivity() { 432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // It is not required to change the activity state to UNLOADED - unless we 433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // would add state observers. 43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ActivityViewModel* WebActivity::GetActivityViewModel() { 43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return this; 43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 43946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 440116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebActivity::SetCurrentState(Activity::ActivityState state) { 4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(state, current_state_); 442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (state) { 443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ACTIVITY_VISIBLE: 4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!web_view_) 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HideContentProxy(); 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReloadAndObserve(); 4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ACTIVITY_INVISIBLE: 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!web_view_) 4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (current_state_ == ACTIVITY_VISIBLE) 4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ShowContentProxy(); 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReloadAndObserve(); 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ACTIVITY_BACKGROUND_LOW_PRIORITY: 460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(ACTIVITY_VISIBLE == current_state_ || 461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ACTIVITY_INVISIBLE == current_state_); 462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(skuhne): Do this. 463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ACTIVITY_PERSISTENT: 465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(ACTIVITY_BACKGROUND_LOW_PRIORITY, current_state_); 466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(skuhne): Do this. As soon as the new resource management is 467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // agreed upon - or remove otherwise. 468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ACTIVITY_UNLOADED: 470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_NE(ACTIVITY_UNLOADED, current_state_); 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (content_proxy_) 4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_proxy_->ContentWillUnload(); 473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Observe(NULL); 474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_view_->EvictContent(); 475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Remember the last requested state. 478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_state_ = state; 479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 481116680a4aac90f2aa7413d9095a592090648e557Ben MurdochActivity::ActivityState WebActivity::GetCurrentState() { 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If the content is evicted, the state has to be UNLOADED. 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!web_view_ || 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !web_view_->IsContentEvicted() || 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_state_ == ACTIVITY_UNLOADED); 486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return current_state_; 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 489116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebActivity::IsVisible() { 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return web_view_ && 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_->visible() && 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_state_ != ACTIVITY_UNLOADED; 493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 495116680a4aac90f2aa7413d9095a592090648e557Ben MurdochActivity::ActivityMediaState WebActivity::GetMediaState() { 496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(skuhne): The function GetTabMediaStateForContents(WebContents), 497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // and the AudioStreamMonitor needs to be moved from Chrome into contents to 498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // make it more modular and so that we can use it from here. 499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return Activity::ACTIVITY_MEDIA_STATE_NONE; 500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)aura::Window* WebActivity::GetWindow() { 50303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return !web_view_ ? NULL : web_view_->GetWidget()->GetNativeWindow(); 50403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 50503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicontent::WebContents* WebActivity::GetWebContents() { 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return !web_view_ ? NULL : web_view_->GetWebContents(); 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WebActivity::Init() { 511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(web_view_); 512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_view_->InstallAccelerators(); 513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 515116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSkColor WebActivity::GetRepresentativeColor() const { 5166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return web_view_ ? title_color_ : kDefaultUnavailableColor; 51746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 51846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 519116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 WebActivity::GetTitle() const { 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!title_.empty()) 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return title_; 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(oshima): Use title set by the web contents. 5236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return web_view_ ? base::UTF8ToUTF16( 5246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_->GetWebContents()->GetVisibleURL().host()) 5256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : base::string16(); 52646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 52746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigfx::ImageSkia WebActivity::GetIcon() const { 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return icon_; 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 532116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebActivity::UsesFrame() const { 533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)views::View* WebActivity::GetContentsView() { 53746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!web_view_) { 538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_view_ = new AthenaWebView(browser_context_); 53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) web_view_->LoadInitialURL(url_); 5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Make sure the content gets properly shown. 5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (current_state_ == ACTIVITY_VISIBLE) { 5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HideContentProxy(); 5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReloadAndObserve(); 5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if (current_state_ == ACTIVITY_INVISIBLE) { 5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ShowContentProxy(); 5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReloadAndObserve(); 5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If not previously specified, we change the state now to invisible.. 5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetCurrentState(ACTIVITY_INVISIBLE); 5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 55146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 55246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return web_view_; 55346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 55446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciviews::Widget* WebActivity::CreateWidget() { 5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; // Use default widget. 557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 559116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::ImageSkia WebActivity::GetOverviewModeImage() { 5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (content_proxy_.get()) 5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_proxy_->GetContentImage(); 5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return gfx::ImageSkia(); 5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebActivity::PrepareContentsForOverview() { 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Turn on fast resizing to avoid re-laying out the web contents when 5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // entering / exiting overview mode and the content is visible. 5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!content_proxy_.get()) 5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_->SetFastResize(true); 5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebActivity::ResetContentsView() { 5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Turn on fast resizing to avoid re-laying out the web contents when 5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // entering / exiting overview mode and the content is visible. 5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!content_proxy_.get()) { 5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_->SetFastResize(false); 5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_->Layout(); 5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 58146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void WebActivity::TitleWasSet(content::NavigationEntry* entry, 58246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool explicit_set) { 58346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ActivityManager::Get()->UpdateActivity(this); 58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebActivity::DidNavigateMainFrame( 5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const content::LoadCommittedDetails& details, 5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const content::FrameNavigateParams& params) { 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Prevent old image requests from calling back to OnDidDownloadFavicon(). 5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_ptr_factory_.InvalidateWeakPtrs(); 5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci icon_ = gfx::ImageSkia(); 5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ActivityManager::Get()->UpdateActivity(this); 5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void WebActivity::DidUpdateFaviconURL( 59746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::vector<content::FaviconURL>& candidates) { 5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Pick an arbitrary favicon of type FAVICON to use. 5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(pkotwicz): Do something better once the favicon code is componentized. 6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // (crbug.com/401997) 6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_ptr_factory_.InvalidateWeakPtrs(); 6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < candidates.size(); ++i) { 6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (candidates[i].icon_type == content::FaviconURL::FAVICON) { 6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_->GetWebContents()->DownloadImage( 6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci candidates[i].icon_url, 6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&WebActivity::OnDidDownloadFavicon, 6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_ptr_factory_.GetWeakPtr())); 6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebActivity::OnDidDownloadFavicon( 6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int id, 6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int http_status_code, 6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& url, 6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<SkBitmap>& bitmaps, 6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<gfx::Size>& original_bitmap_sizes) { 6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci icon_ = CreateFaviconImageSkia( 6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bitmaps, original_bitmap_sizes, kIconSize, NULL); 62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ActivityManager::Get()->UpdateActivity(this); 62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void WebActivity::DidChangeThemeColor(SkColor theme_color) { 6276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) title_color_ = theme_color; 6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ActivityManager::Get()->UpdateActivity(this); 6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebActivity::HideContentProxy() { 6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (content_proxy_.get()) 6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_proxy_.reset(NULL); 6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebActivity::ShowContentProxy() { 6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!content_proxy_.get() && web_view_) 6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_proxy_.reset(new ContentProxy(web_view_, this)); 6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebActivity::ReloadAndObserve() { 6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (web_view_->IsContentEvicted()) { 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_EQ(ACTIVITY_UNLOADED, current_state_); 6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_->ReloadContent(); 6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Observe(web_view_->GetWebContents()); 6476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 6486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace athena 650