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.
5 #include "content/public/browser/web_contents_delegate.h"
7 #include "base/compiler_specific.h"
8 #include "base/logging.h"
9 #include "base/memory/singleton.h"
10 #include "content/public/browser/render_view_host.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/common/url_constants.h"
13 #include "content/public/common/bindings_policy.h"
14 #include "ui/gfx/rect.h"
18 WebContentsDelegate::WebContentsDelegate() {
21 WebContents
* WebContentsDelegate::OpenURLFromTab(WebContents
* source
,
22 const OpenURLParams
& params
) {
26 bool WebContentsDelegate::IsPopupOrPanel(const WebContents
* source
) const {
30 bool WebContentsDelegate::CanLoadDataURLsInWebUI() const { return false; }
32 bool WebContentsDelegate::CanOverscrollContent() const { return false; }
34 gfx::Rect
WebContentsDelegate::GetRootWindowResizerRect() const {
38 bool WebContentsDelegate::ShouldSuppressDialogs() {
42 bool WebContentsDelegate::AddMessageToConsole(WebContents
* source
,
44 const string16
& message
,
46 const string16
& source_id
) {
50 void WebContentsDelegate::BeforeUnloadFired(WebContents
* web_contents
,
52 bool* proceed_to_fire_unload
) {
53 *proceed_to_fire_unload
= true;
56 bool WebContentsDelegate::ShouldFocusLocationBarByDefault(WebContents
* source
) {
60 bool WebContentsDelegate::ShouldFocusPageAfterCrash() {
64 bool WebContentsDelegate::TakeFocus(WebContents
* source
, bool reverse
) {
68 int WebContentsDelegate::GetExtraRenderViewHeight() const {
72 void WebContentsDelegate::CanDownload(
73 RenderViewHost
* render_view_host
,
75 const std::string
& request_method
,
76 const base::Callback
<void(bool)>& callback
) {
80 bool WebContentsDelegate::HandleContextMenu(
81 const content::ContextMenuParams
& params
) {
85 void WebContentsDelegate::ViewSourceForTab(WebContents
* source
,
86 const GURL
& page_url
) {
87 // Fall back implementation based entirely on the view-source scheme.
88 // It suffers from http://crbug.com/523 and that is why browser overrides
89 // it with proper implementation.
90 GURL url
= GURL(chrome::kViewSourceScheme
+ std::string(":") +
92 OpenURLFromTab(source
, OpenURLParams(url
, Referrer(),
94 PAGE_TRANSITION_LINK
, false));
97 void WebContentsDelegate::ViewSourceForFrame(WebContents
* source
,
98 const GURL
& frame_url
,
99 const std::string
& content_state
) {
100 // Same as ViewSourceForTab, but for given subframe.
101 GURL url
= GURL(chrome::kViewSourceScheme
+ std::string(":") +
103 OpenURLFromTab(source
, OpenURLParams(url
, Referrer(),
105 PAGE_TRANSITION_LINK
, false));
108 bool WebContentsDelegate::PreHandleKeyboardEvent(
110 const NativeWebKeyboardEvent
& event
,
111 bool* is_keyboard_shortcut
) {
115 bool WebContentsDelegate::OnGoToEntryOffset(int offset
) {
119 bool WebContentsDelegate::ShouldCreateWebContents(
120 WebContents
* web_contents
,
122 WindowContainerType window_container_type
,
123 const string16
& frame_name
,
124 const GURL
& target_url
) {
128 JavaScriptDialogManager
* WebContentsDelegate::GetJavaScriptDialogManager() {
132 bool WebContentsDelegate::IsFullscreenForTabOrPending(
133 const WebContents
* web_contents
) const {
137 content::ColorChooser
* WebContentsDelegate::OpenColorChooser(
138 WebContents
* web_contents
,
139 int color_chooser_id
,
144 bool WebContentsDelegate::RequestPpapiBrokerPermission(
145 WebContents
* web_contents
,
147 const base::FilePath
& plugin_path
,
148 const base::Callback
<void(bool)>& callback
) {
152 WebContentsDelegate::~WebContentsDelegate() {
153 while (!attached_contents_
.empty()) {
154 WebContents
* web_contents
= *attached_contents_
.begin();
155 web_contents
->SetDelegate(NULL
);
157 DCHECK(attached_contents_
.empty());
160 void WebContentsDelegate::Attach(WebContents
* web_contents
) {
161 DCHECK(attached_contents_
.find(web_contents
) == attached_contents_
.end());
162 attached_contents_
.insert(web_contents
);
165 void WebContentsDelegate::Detach(WebContents
* web_contents
) {
166 DCHECK(attached_contents_
.find(web_contents
) != attached_contents_
.end());
167 attached_contents_
.erase(web_contents
);
170 } // namespace content