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_WEB_DIALOGS_WEB_DIALOG_WEB_CONTENTS_DELEGATE_H_
6#define UI_WEB_DIALOGS_WEB_DIALOG_WEB_CONTENTS_DELEGATE_H_
7
8#include "base/compiler_specific.h"
9#include "content/public/browser/web_contents_delegate.h"
10#include "ui/web_dialogs/web_dialogs_export.h"
11
12namespace ui {
13
14// This class implements (and mostly ignores) most of
15// content::WebContentsDelegate for use in a Web dialog. Subclasses need only
16// override a few methods instead of the everything from
17// content::WebContentsDelegate; this way, implementations on all platforms
18// behave consistently.
19class WEB_DIALOGS_EXPORT WebDialogWebContentsDelegate
20    : public content::WebContentsDelegate {
21 public:
22  // Handles OpenURLFromTab and AddNewContents for WebDialogWebContentsDelegate.
23  class WebContentsHandler {
24   public:
25    virtual ~WebContentsHandler() {}
26    virtual content::WebContents* OpenURLFromTab(
27        content::BrowserContext* context,
28        content::WebContents* source,
29        const content::OpenURLParams& params) = 0;
30    virtual void AddNewContents(content::BrowserContext* context,
31                                content::WebContents* source,
32                                content::WebContents* new_contents,
33                                WindowOpenDisposition disposition,
34                                const gfx::Rect& initial_pos,
35                                bool user_gesture) = 0;
36  };
37
38  // context and handler must be non-NULL.
39  // Takes the ownership of handler.
40  WebDialogWebContentsDelegate(content::BrowserContext* context,
41                               WebContentsHandler* handler);
42
43  virtual ~WebDialogWebContentsDelegate();
44
45  // The returned browser context is guaranteed to be original if non-NULL.
46  content::BrowserContext* browser_context() const {
47    return browser_context_;
48  }
49
50  // Calling this causes all following events sent from the
51  // WebContents object to be ignored.  It also makes all following
52  // calls to browser_context() return NULL.
53  void Detach();
54
55  // content::WebContentsDelegate declarations.
56  virtual content::WebContents* OpenURLFromTab(
57      content::WebContents* source,
58      const content::OpenURLParams& params) OVERRIDE;
59  virtual void AddNewContents(content::WebContents* source,
60                              content::WebContents* new_contents,
61                              WindowOpenDisposition disposition,
62                              const gfx::Rect& initial_pos,
63                              bool user_gesture,
64                              bool* was_blocked) OVERRIDE;
65  virtual bool IsPopupOrPanel(
66      const content::WebContents* source) const OVERRIDE;
67  virtual bool PreHandleGestureEvent(
68      content::WebContents* source,
69      const blink::WebGestureEvent& event) OVERRIDE;
70
71 private:
72  // Weak pointer.  Always an original profile.
73  content::BrowserContext* browser_context_;
74
75  scoped_ptr<WebContentsHandler> handler_;
76
77  DISALLOW_COPY_AND_ASSIGN(WebDialogWebContentsDelegate);
78};
79
80}  // namespace ui
81
82#endif  // UI_WEB_DIALOGS_WEB_DIALOG_WEB_CONTENTS_DELEGATE_H_
83