15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_VIEWS_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_VIEWS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_view.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h"
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/native/native_view_host.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This handles the display portion of an ExtensionHost.
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ExtensionViewViews : public views::NativeViewHost,
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           public extensions::ExtensionView {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A class that represents the container that this view is in.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (bottom shelf, side bar, etc.)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Container {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Container() {}
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnExtensionSizeChanged(ExtensionViewViews* view) {}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionViewViews(extensions::ExtensionHost* host, Browser* browser);
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~ExtensionViewViews();
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // views::NativeViewHost:
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetVisible(bool is_visible) OVERRIDE;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual gfx::NativeCursor GetCursor(const ui::MouseEvent& event) OVERRIDE;
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ViewHierarchyChanged(
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const ViewHierarchyChangedDetails& details) OVERRIDE;
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* host() const { return host_; }
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::Extension* extension() const { return host_->extension(); }
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RenderViewHost* render_view_host() const {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return host_->render_view_host();
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_minimum_size(const gfx::Size& minimum_size) {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    minimum_size_ = minimum_size;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_container(Container* container) { container_ = container; }
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIsClipped(bool is_clipped);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // extensions::ExtensionView:
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void Init() OVERRIDE;
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual Browser* GetBrowser() OVERRIDE;
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual gfx::NativeView GetNativeView() OVERRIDE;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void ResizeDueToAutoResize(const gfx::Size& new_size) OVERRIDE;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void RenderViewCreated() OVERRIDE;
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void HandleKeyboardEvent(
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::WebContents* source,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const content::NativeWebKeyboardEvent& event) OVERRIDE;
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void DidStopLoading() OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class extensions::ExtensionHost;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // views::NativeViewHost:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SkipDefaultKeyEventProcessing(const ui::KeyEvent& e) OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void PreferredSizeChanged() OVERRIDE;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnFocus() OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes the RenderWidgetHostView for this object.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateWidgetHostView();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We wait to show the ExtensionViewViews until several things have loaded.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowIfCompletelyLoaded();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore object to initial state. Called on shutdown or after a renderer
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crash.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CleanUp();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The running extension instance that we're displaying.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that host_ owns view
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* host_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser window that this view is in.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we've been initialized.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool initialized_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // What we should set the preferred width to once the ExtensionViewViews has
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pending_preferred_size_;
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size minimum_size_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The container this view is in (not necessarily its direct superview).
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: the view does not own its container.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Container* container_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this extension view is clipped.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_clipped_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A handler to handle unhandled keyboard messages coming back from the
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // renderer process.
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionViewViews);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_VIEWS_H_
118