extension_view_views.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/unhandled_keyboard_event_handler.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/native/native_view_host.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionHost;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This handles the display portion of an ExtensionHost.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionViewViews : public views::NativeViewHost {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionViewViews(extensions::ExtensionHost* host, Browser* browser);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionViewViews();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A class that represents the container that this view is in.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (bottom shelf, side bar, etc.)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Container {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Container() {}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnExtensionSizeChanged(ExtensionViewViews* view) {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnViewWasResized() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* host() const { return host_; }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser() const { return browser_; }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension() const;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* render_view_host() const;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidStopLoading();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIsClipped(bool is_clipped);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notification from ExtensionHost.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResizeDueToAutoResize(const gfx::Size& new_size);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Method for the ExtensionHost to notify us when the RenderViewHost has a
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connection.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RenderViewCreated();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a custom background for the view. The background will be tiled.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBackground(const SkBitmap& background);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the container for this view.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetContainer(Container* container) { container_ = container; }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles unhandled keyboard messages coming back from the renderer process.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleKeyboardEvent(const content::NativeWebKeyboardEvent& event);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::NativeViewHost:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::NativeCursor GetCursor(const ui::MouseEvent& event) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetVisible(bool is_visible) OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ViewHierarchyChanged(bool is_add,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    views::View* parent,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    views::View* child) OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PreferredSizeChanged() OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SkipDefaultKeyEventProcessing(const ui::KeyEvent& e) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class extensions::ExtensionHost;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes the RenderWidgetHostView for this object.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateWidgetHostView();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We wait to show the ExtensionViewViews until several things have loaded.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowIfCompletelyLoaded();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore object to initial state. Called on shutdown or after a renderer
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crash.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CleanUp();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The running extension instance that we're displaying.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that host_ owns view
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* host_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser window that this view is in.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we've been initialized.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool initialized_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The background the view should have once it is initialized. This is set
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the view has a custom background, but hasn't been initialized yet.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap pending_background_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // What we should set the preferred width to once the ExtensionViewViews has
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pending_preferred_size_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The container this view is in (not necessarily its direct superview).
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: the view does not own its container.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Container* container_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this extension view is clipped.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_clipped_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A handler to handle unhandled keyboard messages coming back from the
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // renderer process.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionViewViews);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_VIEWS_H_
123