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 #include "content/public/browser/web_contents_delegate.h" 6 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" 15 16 namespace content { 17 18 WebContentsDelegate::WebContentsDelegate() { 19 } 20 21 WebContents* WebContentsDelegate::OpenURLFromTab(WebContents* source, 22 const OpenURLParams& params) { 23 return NULL; 24 } 25 26 bool WebContentsDelegate::IsPopupOrPanel(const WebContents* source) const { 27 return false; 28 } 29 30 bool WebContentsDelegate::CanOverscrollContent() const { return false; } 31 32 gfx::Rect WebContentsDelegate::GetRootWindowResizerRect() const { 33 return gfx::Rect(); 34 } 35 36 bool WebContentsDelegate::ShouldSuppressDialogs() { 37 return false; 38 } 39 40 bool WebContentsDelegate::ShouldPreserveAbortedURLs(WebContents* source) { 41 return false; 42 } 43 44 bool WebContentsDelegate::AddMessageToConsole(WebContents* source, 45 int32 level, 46 const base::string16& message, 47 int32 line_no, 48 const base::string16& source_id) { 49 return false; 50 } 51 52 void WebContentsDelegate::BeforeUnloadFired(WebContents* web_contents, 53 bool proceed, 54 bool* proceed_to_fire_unload) { 55 *proceed_to_fire_unload = true; 56 } 57 58 bool WebContentsDelegate::ShouldFocusLocationBarByDefault(WebContents* source) { 59 return false; 60 } 61 62 bool WebContentsDelegate::ShouldFocusPageAfterCrash() { 63 return true; 64 } 65 66 bool WebContentsDelegate::TakeFocus(WebContents* source, bool reverse) { 67 return false; 68 } 69 70 int WebContentsDelegate::GetExtraRenderViewHeight() const { 71 return 0; 72 } 73 74 void WebContentsDelegate::CanDownload( 75 RenderViewHost* render_view_host, 76 const GURL& url, 77 const std::string& request_method, 78 const base::Callback<void(bool)>& callback) { 79 callback.Run(true); 80 } 81 82 bool WebContentsDelegate::HandleContextMenu( 83 const content::ContextMenuParams& params) { 84 return false; 85 } 86 87 void WebContentsDelegate::ViewSourceForTab(WebContents* source, 88 const GURL& page_url) { 89 // Fall back implementation based entirely on the view-source scheme. 90 // It suffers from http://crbug.com/523 and that is why browser overrides 91 // it with proper implementation. 92 GURL url = GURL(kViewSourceScheme + std::string(":") + page_url.spec()); 93 OpenURLFromTab(source, OpenURLParams(url, Referrer(), 94 NEW_FOREGROUND_TAB, 95 PAGE_TRANSITION_LINK, false)); 96 } 97 98 void WebContentsDelegate::ViewSourceForFrame(WebContents* source, 99 const GURL& frame_url, 100 const PageState& page_state) { 101 // Same as ViewSourceForTab, but for given subframe. 102 GURL url = GURL(kViewSourceScheme + std::string(":") + frame_url.spec()); 103 OpenURLFromTab(source, OpenURLParams(url, Referrer(), 104 NEW_FOREGROUND_TAB, 105 PAGE_TRANSITION_LINK, false)); 106 } 107 108 bool WebContentsDelegate::PreHandleKeyboardEvent( 109 WebContents* source, 110 const NativeWebKeyboardEvent& event, 111 bool* is_keyboard_shortcut) { 112 return false; 113 } 114 115 bool WebContentsDelegate::PreHandleGestureEvent( 116 WebContents* source, 117 const blink::WebGestureEvent& event) { 118 return false; 119 } 120 121 bool WebContentsDelegate::CanDragEnter( 122 WebContents* source, 123 const DropData& data, 124 blink::WebDragOperationsMask operations_allowed) { 125 return true; 126 } 127 128 bool WebContentsDelegate::OnGoToEntryOffset(int offset) { 129 return true; 130 } 131 132 bool WebContentsDelegate::ShouldCreateWebContents( 133 WebContents* web_contents, 134 int route_id, 135 WindowContainerType window_container_type, 136 const base::string16& frame_name, 137 const GURL& target_url, 138 const std::string& partition_id, 139 SessionStorageNamespace* session_storage_namespace) { 140 return true; 141 } 142 143 JavaScriptDialogManager* WebContentsDelegate::GetJavaScriptDialogManager() { 144 return NULL; 145 } 146 147 bool WebContentsDelegate::EmbedsFullscreenWidget() const { 148 return false; 149 } 150 151 bool WebContentsDelegate::IsFullscreenForTabOrPending( 152 const WebContents* web_contents) const { 153 return false; 154 } 155 156 content::ColorChooser* WebContentsDelegate::OpenColorChooser( 157 WebContents* web_contents, 158 SkColor color, 159 const std::vector<ColorSuggestion>& suggestions) { 160 return NULL; 161 } 162 163 void WebContentsDelegate::RequestMediaAccessPermission( 164 WebContents* web_contents, 165 const MediaStreamRequest& request, 166 const MediaResponseCallback& callback) { 167 callback.Run(MediaStreamDevices(), 168 MEDIA_DEVICE_INVALID_STATE, 169 scoped_ptr<MediaStreamUI>()); 170 } 171 172 bool WebContentsDelegate::RequestPpapiBrokerPermission( 173 WebContents* web_contents, 174 const GURL& url, 175 const base::FilePath& plugin_path, 176 const base::Callback<void(bool)>& callback) { 177 return false; 178 } 179 180 WebContentsDelegate::~WebContentsDelegate() { 181 while (!attached_contents_.empty()) { 182 WebContents* web_contents = *attached_contents_.begin(); 183 web_contents->SetDelegate(NULL); 184 } 185 DCHECK(attached_contents_.empty()); 186 } 187 188 void WebContentsDelegate::Attach(WebContents* web_contents) { 189 DCHECK(attached_contents_.find(web_contents) == attached_contents_.end()); 190 attached_contents_.insert(web_contents); 191 } 192 193 void WebContentsDelegate::Detach(WebContents* web_contents) { 194 DCHECK(attached_contents_.find(web_contents) != attached_contents_.end()); 195 attached_contents_.erase(web_contents); 196 } 197 198 gfx::Size WebContentsDelegate::GetSizeForNewRenderView( 199 WebContents* web_contents) const { 200 return gfx::Size(); 201 } 202 203 bool WebContentsDelegate::IsNeverVisible(WebContents* web_contents) { 204 return false; 205 } 206 207 } // namespace content 208