text: // Copyright (c) 2012 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 UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
  #define UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
  
  #include <string>
  #include <vector>
  
  #include "base/gtest_prod_util.h"
  #include "base/memory/scoped_ptr.h"
  #include "ui/gfx/size.h"
  #include "ui/views/controls/webview/webview_export.h"
  #include "ui/views/widget/widget_delegate.h"
  #include "ui/views/window/client_view.h"
  #include "ui/web_dialogs/web_dialog_delegate.h"
  #include "ui/web_dialogs/web_dialog_web_contents_delegate.h"
  
  namespace content {
  class BrowserContext;
  }
  
  namespace views {
  class WebView;
  
  ////////////////////////////////////////////////////////////////////////////////
  //
  // WebDialogView is a view used to display an web dialog to the user. The
  // content of the dialogs is determined by the delegate
  // (ui::WebDialogDelegate), but is basically a file URL along with a
  // JSON input string. The HTML is supposed to show a UI to the user and is
  // expected to send back a JSON file as a return value.
  //
  ////////////////////////////////////////////////////////////////////////////////
  //
  // TODO(akalin): Make WebDialogView contain an WebDialogWebContentsDelegate
  // instead of inheriting from it to avoid violating the "no multiple
  // inheritance" rule.
  class WEBVIEW_EXPORT WebDialogView : public views::ClientView,
                                       public ui::WebDialogWebContentsDelegate,
                                       public ui::WebDialogDelegate,
                                       public views::WidgetDelegate {
   public:
    // |handler| must not be NULL and this class takes the ownership.
    WebDialogView(content::BrowserContext* context,
                  ui::WebDialogDelegate* delegate,
                  WebContentsHandler* handler);
    virtual ~WebDialogView();
  
    // For testing.
    content::WebContents* web_contents();
  
    // Overridden from views::ClientView:
    virtual gfx::Size GetPreferredSize() OVERRIDE;
    virtual bool AcceleratorPressed(const ui::Accelerator& accelerator)
        OVERRIDE;
    virtual void ViewHierarchyChanged(
        const ViewHierarchyChangedDetails& details) OVERRIDE;
    virtual bool CanClose() OVERRIDE;
  
    // Overridden from views::WidgetDelegate:
    virtual bool CanResize() const OVERRIDE;
    virtual ui::ModalType GetModalType() const OVERRIDE;
    virtual string16 GetWindowTitle() const OVERRIDE;
    virtual std::string GetWindowName() const OVERRIDE;
    virtual void WindowClosing() OVERRIDE;
    virtual views::View* GetContentsView() OVERRIDE;
    virtual ClientView* CreateClientView(views::Widget* widget) OVERRIDE;
    virtual views::View* GetInitiallyFocusedView() OVERRIDE;
    virtual bool ShouldShowWindowTitle() const OVERRIDE;
    virtual views::Widget* GetWidget() OVERRIDE;
    virtual const views::Widget* GetWidget() const OVERRIDE;
  
    // Overridden from ui::WebDialogDelegate:
    virtual ui::ModalType GetDialogModalType() const OVERRIDE;
    virtual string16 GetDialogTitle() const OVERRIDE;
    virtual GURL GetDialogContentURL() const OVERRIDE;
    virtual void GetWebUIMessageHandlers(
        std::vector<content::WebUIMessageHandler*>* handlers) const OVERRIDE;
    virtual void GetDialogSize(gfx::Size* size) const OVERRIDE;
    virtual void GetMinimumDialogSize(gfx::Size* size) const OVERRIDE;
    virtual std::string GetDialogArgs() const OVERRIDE;
    virtual void OnDialogShown(
        content::WebUI* webui,
        content::RenderViewHost* render_view_host) OVERRIDE;
    virtual void OnDialogClosed(const std::string& json_retval) OVERRIDE;
    virtual void OnDialogCloseFromWebUI(
        const std::string& json_retval) OVERRIDE;
    virtual void OnCloseContents(content::WebContents* source,
                                 bool* out_close_dialog) OVERRIDE;
    virtual bool ShouldShowDialogTitle() const OVERRIDE;
    virtual bool HandleContextMenu(
        const content::ContextMenuParams& params) OVERRIDE;
  
    // Overridden from content::WebContentsDelegate:
    virtual void MoveContents(content::WebContents* source,
                              const gfx::Rect& pos) OVERRIDE;
    virtual void HandleKeyboardEvent(
        content::WebContents* source,
        const content::NativeWebKeyboardEvent& event) OVERRIDE;
    virtual void CloseContents(content::WebContents* source) OVERRIDE;
    virtual content::WebContents* OpenURLFromTab(
        content::WebContents* source,
        const content::OpenURLParams& params) OVERRIDE;
    virtual void AddNewContents(content::WebContents* source,
                                content::WebContents* new_contents,
                                WindowOpenDisposition disposition,
                                const gfx::Rect& initial_pos,
                                bool user_gesture,
                                bool* was_blocked) OVERRIDE;
    virtual void LoadingStateChanged(content::WebContents* source) OVERRIDE;
    virtual void BeforeUnloadFired(content::WebContents* tab,
                                   bool proceed,
                                   bool* proceed_to_fire_unload) OVERRIDE;
  
   private:
    FRIEND_TEST_ALL_PREFIXES(WebDialogBrowserTest, WebContentRendered);
  
    // Initializes the contents of the dialog.
    void InitDialog();
  
    // Whether the view is initialized. That is, dialog accelerators is registered
    // and FreezeUpdates property is set to prevent WM from showing the window
    // until the property is removed.
    bool initialized_;
  
    // This view is a delegate to the HTML content since it needs to get notified
    // about when the dialog is closing. For all other actions (besides dialog
    // closing) we delegate to the creator of this view, which we keep track of
    // using this variable.
    ui::WebDialogDelegate* delegate_;
  
    views::WebView* web_view_;
  
    // Whether user is attempting to close the dialog and we are processing
    // beforeunload event.
    bool is_attempting_close_dialog_;
  
    // Whether beforeunload event has been fired and we have finished processing
    // beforeunload event.
    bool before_unload_fired_;
  
    // Whether the dialog is closed from WebUI in response to a "DialogClose"
    // message.
    bool closed_via_webui_;
  
    // A json string returned to WebUI from a "DialogClosed" message.
    std::string dialog_close_retval_;
  
    // Whether CloseContents() has been called.
    bool close_contents_called_;
  
    DISALLOW_COPY_AND_ASSIGN(WebDialogView);
  };
  
  }  // namespace views
  
  #endif  // UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
  