text: // Copyright 2013 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_VIEW_HOST_H_
  #define CHROME_BROWSER_EXTENSIONS_EXTENSION_VIEW_HOST_H_
  
  #include "base/memory/scoped_ptr.h"
  #include "components/web_modal/popup_manager.h"
  #include "components/web_modal/web_contents_modal_dialog_host.h"
  #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
  #include "extensions/browser/extension_host.h"
  
  class Browser;
  
  namespace content {
  class SiteInstance;
  class WebContents;
  }
  
  namespace extensions {
  
  class ExtensionView;
  
  // The ExtensionHost for an extension that backs a view in the browser UI. For
  // example, this could be an extension popup, infobar or dialog, but not a
  // background page.
  // TODO(gbillock): See if we can remove WebContentsModalDialogManager here.
  class ExtensionViewHost
      : public ExtensionHost,
        public web_modal::WebContentsModalDialogManagerDelegate,
        public web_modal::WebContentsModalDialogHost {
   public:
    ExtensionViewHost(const Extension* extension,
                      content::SiteInstance* site_instance,
                      const GURL& url,
                      ViewType host_type);
    ~ExtensionViewHost() override;
  
    ExtensionView* view() { return view_.get(); }
    const ExtensionView* view() const { return view_.get(); }
  
    // Create an ExtensionView and tie it to this host and |browser|.  Note NULL
    // is a valid argument for |browser|.  Extension views may be bound to
    // tab-contents hosted in ExternalTabContainer objects, which do not
    // instantiate Browser objects.
    void CreateView(Browser* browser);
  
    void SetAssociatedWebContents(content::WebContents* web_contents);
  
    // Handles keyboard events that were not handled by HandleKeyboardEvent().
    // Platform specific implementation may override this method to handle the
    // event in platform specific way.
    virtual void UnhandledKeyboardEvent(
        content::WebContents* source,
        const content::NativeWebKeyboardEvent& event);
  
    // ExtensionHost
    void OnDidStopLoading() override;
    void OnDocumentAvailable() override;
    void LoadInitialURL() override;
    bool IsBackgroundPage() const override;
  
    // content::WebContentsDelegate
    content::WebContents* OpenURLFromTab(
        content::WebContents* source,
        const content::OpenURLParams& params) override;
    bool PreHandleKeyboardEvent(content::WebContents* source,
                                const content::NativeWebKeyboardEvent& event,
                                bool* is_keyboard_shortcut) override;
    void HandleKeyboardEvent(
        content::WebContents* source,
        const content::NativeWebKeyboardEvent& event) override;
    bool PreHandleGestureEvent(content::WebContents* source,
                               const blink::WebGestureEvent& event) override;
    content::ColorChooser* OpenColorChooser(
        content::WebContents* web_contents,
        SkColor color,
        const std::vector<content::ColorSuggestion>& suggestions) override;
    void RunFileChooser(content::WebContents* tab,
                        const content::FileChooserParams& params) override;
    void ResizeDueToAutoResize(content::WebContents* source,
                               const gfx::Size& new_size) override;
  
    // content::WebContentsObserver
    void RenderViewCreated(content::RenderViewHost* render_view_host) override;
  
    // web_modal::WebContentsModalDialogManagerDelegate
    web_modal::WebContentsModalDialogHost* GetWebContentsModalDialogHost()
        override;
    bool IsWebContentsVisible(content::WebContents* web_contents) override;
  
    // web_modal::WebContentsModalDialogHost
    gfx::NativeView GetHostView() const override;
    gfx::Point GetDialogPosition(const gfx::Size& size) override;
    gfx::Size GetMaximumDialogSize() override;
    void AddObserver(web_modal::ModalDialogHostObserver* observer) override;
    void RemoveObserver(web_modal::ModalDialogHostObserver* observer) override;
  
    // extensions::ExtensionFunctionDispatcher::Delegate
    WindowController* GetExtensionWindowController() const override;
    content::WebContents* GetAssociatedWebContents() const override;
    content::WebContents* GetVisibleWebContents() const override;
  
    // content::NotificationObserver
    void Observe(int type,
                 const content::NotificationSource& source,
                 const content::NotificationDetails& details) override;
  
   private:
    // Implemented per-platform. Create the platform-specific ExtensionView.
    static scoped_ptr<ExtensionView> CreateExtensionView(ExtensionViewHost* host,
                                                         Browser* browser);
  
    // Insert a default style sheet for Extension Infobars.
    void InsertInfobarCSS();
  
    // Optional view that shows the rendered content in the UI.
    scoped_ptr<ExtensionView> view_;
  
    // The relevant WebContents associated with this ExtensionViewHost, if any.
    content::WebContents* associated_web_contents_;
  
    // Observer to detect when the associated web contents is destroyed.
    class AssociatedWebContentsObserver;
    scoped_ptr<AssociatedWebContentsObserver> associated_web_contents_observer_;
  
    // Manage popups overlaying the WebContents in this EVH.
    // TODO(gbillock): should usually not be used -- instead use the parent
    // window's popup manager. Should only be used when the EVH is created without
    // a parent window.
    scoped_ptr<web_modal::PopupManager> popup_manager_;
  
    DISALLOW_COPY_AND_ASSIGN(ExtensionViewHost);
  };
  
  }  // namespace extensions
  
  #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_VIEW_HOST_H_
  