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