Home | History | Annotate | Download | only in webview
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
      6 #define UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/gtest_prod_util.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "ui/gfx/size.h"
     14 #include "ui/views/controls/webview/webview_export.h"
     15 #include "ui/views/widget/widget_delegate.h"
     16 #include "ui/views/window/client_view.h"
     17 #include "ui/web_dialogs/web_dialog_delegate.h"
     18 #include "ui/web_dialogs/web_dialog_web_contents_delegate.h"
     19 
     20 namespace content {
     21 class BrowserContext;
     22 }
     23 
     24 namespace views {
     25 class WebView;
     26 
     27 ////////////////////////////////////////////////////////////////////////////////
     28 //
     29 // WebDialogView is a view used to display an web dialog to the user. The
     30 // content of the dialogs is determined by the delegate
     31 // (ui::WebDialogDelegate), but is basically a file URL along with a
     32 // JSON input string. The HTML is supposed to show a UI to the user and is
     33 // expected to send back a JSON file as a return value.
     34 //
     35 ////////////////////////////////////////////////////////////////////////////////
     36 //
     37 // TODO(akalin): Make WebDialogView contain an WebDialogWebContentsDelegate
     38 // instead of inheriting from it to avoid violating the "no multiple
     39 // inheritance" rule.
     40 class WEBVIEW_EXPORT WebDialogView : public views::ClientView,
     41                                      public ui::WebDialogWebContentsDelegate,
     42                                      public ui::WebDialogDelegate,
     43                                      public views::WidgetDelegate {
     44  public:
     45   // |handler| must not be NULL and this class takes the ownership.
     46   WebDialogView(content::BrowserContext* context,
     47                 ui::WebDialogDelegate* delegate,
     48                 WebContentsHandler* handler);
     49   virtual ~WebDialogView();
     50 
     51   // For testing.
     52   content::WebContents* web_contents();
     53 
     54   // Overridden from views::ClientView:
     55   virtual gfx::Size GetPreferredSize() const OVERRIDE;
     56   virtual gfx::Size GetMinimumSize() const OVERRIDE;
     57   virtual bool AcceleratorPressed(const ui::Accelerator& accelerator)
     58       OVERRIDE;
     59   virtual void ViewHierarchyChanged(
     60       const ViewHierarchyChangedDetails& details) OVERRIDE;
     61   virtual bool CanClose() OVERRIDE;
     62 
     63   // Overridden from views::WidgetDelegate:
     64   virtual bool CanResize() const OVERRIDE;
     65   virtual ui::ModalType GetModalType() const OVERRIDE;
     66   virtual base::string16 GetWindowTitle() const OVERRIDE;
     67   virtual std::string GetWindowName() const OVERRIDE;
     68   virtual void WindowClosing() OVERRIDE;
     69   virtual views::View* GetContentsView() OVERRIDE;
     70   virtual ClientView* CreateClientView(views::Widget* widget) OVERRIDE;
     71   virtual views::View* GetInitiallyFocusedView() OVERRIDE;
     72   virtual bool ShouldShowWindowTitle() const OVERRIDE;
     73   virtual views::Widget* GetWidget() OVERRIDE;
     74   virtual const views::Widget* GetWidget() const OVERRIDE;
     75 
     76   // Overridden from ui::WebDialogDelegate:
     77   virtual ui::ModalType GetDialogModalType() const OVERRIDE;
     78   virtual base::string16 GetDialogTitle() const OVERRIDE;
     79   virtual GURL GetDialogContentURL() const OVERRIDE;
     80   virtual void GetWebUIMessageHandlers(
     81       std::vector<content::WebUIMessageHandler*>* handlers) const OVERRIDE;
     82   virtual void GetDialogSize(gfx::Size* size) const OVERRIDE;
     83   virtual void GetMinimumDialogSize(gfx::Size* size) const OVERRIDE;
     84   virtual std::string GetDialogArgs() const OVERRIDE;
     85   virtual void OnDialogShown(
     86       content::WebUI* webui,
     87       content::RenderViewHost* render_view_host) OVERRIDE;
     88   virtual void OnDialogClosed(const std::string& json_retval) OVERRIDE;
     89   virtual void OnDialogCloseFromWebUI(
     90       const std::string& json_retval) OVERRIDE;
     91   virtual void OnCloseContents(content::WebContents* source,
     92                                bool* out_close_dialog) OVERRIDE;
     93   virtual bool ShouldShowDialogTitle() const OVERRIDE;
     94   virtual bool HandleContextMenu(
     95       const content::ContextMenuParams& params) OVERRIDE;
     96 
     97   // Overridden from content::WebContentsDelegate:
     98   virtual void MoveContents(content::WebContents* source,
     99                             const gfx::Rect& pos) OVERRIDE;
    100   virtual void HandleKeyboardEvent(
    101       content::WebContents* source,
    102       const content::NativeWebKeyboardEvent& event) OVERRIDE;
    103   virtual void CloseContents(content::WebContents* source) OVERRIDE;
    104   virtual content::WebContents* OpenURLFromTab(
    105       content::WebContents* source,
    106       const content::OpenURLParams& params) OVERRIDE;
    107   virtual void AddNewContents(content::WebContents* source,
    108                               content::WebContents* new_contents,
    109                               WindowOpenDisposition disposition,
    110                               const gfx::Rect& initial_pos,
    111                               bool user_gesture,
    112                               bool* was_blocked) OVERRIDE;
    113   virtual void LoadingStateChanged(content::WebContents* source,
    114                                    bool to_different_document) OVERRIDE;
    115   virtual void BeforeUnloadFired(content::WebContents* tab,
    116                                  bool proceed,
    117                                  bool* proceed_to_fire_unload) OVERRIDE;
    118 
    119  private:
    120   FRIEND_TEST_ALL_PREFIXES(WebDialogBrowserTest, WebContentRendered);
    121 
    122   // Initializes the contents of the dialog.
    123   void InitDialog();
    124 
    125   // This view is a delegate to the HTML content since it needs to get notified
    126   // about when the dialog is closing. For all other actions (besides dialog
    127   // closing) we delegate to the creator of this view, which we keep track of
    128   // using this variable.
    129   ui::WebDialogDelegate* delegate_;
    130 
    131   views::WebView* web_view_;
    132 
    133   // Whether user is attempting to close the dialog and we are processing
    134   // beforeunload event.
    135   bool is_attempting_close_dialog_;
    136 
    137   // Whether beforeunload event has been fired and we have finished processing
    138   // beforeunload event.
    139   bool before_unload_fired_;
    140 
    141   // Whether the dialog is closed from WebUI in response to a "dialogClose"
    142   // message.
    143   bool closed_via_webui_;
    144 
    145   // A json string returned to WebUI from a "dialogClose" message.
    146   std::string dialog_close_retval_;
    147 
    148   // Whether CloseContents() has been called.
    149   bool close_contents_called_;
    150 
    151   DISALLOW_COPY_AND_ASSIGN(WebDialogView);
    152 };
    153 
    154 }  // namespace views
    155 
    156 #endif  // UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
    157