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::CanLoadDataURLsInWebUI() const { return false; } 31 32 bool WebContentsDelegate::CanOverscrollContent() const { return false; } 33 34 gfx::Rect WebContentsDelegate::GetRootWindowResizerRect() const { 35 return gfx::Rect(); 36 } 37 38 bool WebContentsDelegate::ShouldSuppressDialogs() { 39 return false; 40 } 41 42 bool WebContentsDelegate::AddMessageToConsole(WebContents* source, 43 int32 level, 44 const string16& message, 45 int32 line_no, 46 const string16& source_id) { 47 return false; 48 } 49 50 void WebContentsDelegate::BeforeUnloadFired(WebContents* web_contents, 51 bool proceed, 52 bool* proceed_to_fire_unload) { 53 *proceed_to_fire_unload = true; 54 } 55 56 bool WebContentsDelegate::ShouldFocusLocationBarByDefault(WebContents* source) { 57 return false; 58 } 59 60 bool WebContentsDelegate::ShouldFocusPageAfterCrash() { 61 return true; 62 } 63 64 bool WebContentsDelegate::TakeFocus(WebContents* source, bool reverse) { 65 return false; 66 } 67 68 int WebContentsDelegate::GetExtraRenderViewHeight() const { 69 return 0; 70 } 71 72 void WebContentsDelegate::CanDownload( 73 RenderViewHost* render_view_host, 74 int request_id, 75 const std::string& request_method, 76 const base::Callback<void(bool)>& callback) { 77 callback.Run(true); 78 } 79 80 bool WebContentsDelegate::HandleContextMenu( 81 const content::ContextMenuParams& params) { 82 return false; 83 } 84 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(kViewSourceScheme + std::string(":") + page_url.spec()); 91 OpenURLFromTab(source, OpenURLParams(url, Referrer(), 92 NEW_FOREGROUND_TAB, 93 PAGE_TRANSITION_LINK, false)); 94 } 95 96 void WebContentsDelegate::ViewSourceForFrame(WebContents* source, 97 const GURL& frame_url, 98 const PageState& page_state) { 99 // Same as ViewSourceForTab, but for given subframe. 100 GURL url = GURL(kViewSourceScheme + std::string(":") + frame_url.spec()); 101 OpenURLFromTab(source, OpenURLParams(url, Referrer(), 102 NEW_FOREGROUND_TAB, 103 PAGE_TRANSITION_LINK, false)); 104 } 105 106 bool WebContentsDelegate::PreHandleKeyboardEvent( 107 WebContents* source, 108 const NativeWebKeyboardEvent& event, 109 bool* is_keyboard_shortcut) { 110 return false; 111 } 112 113 bool WebContentsDelegate::CanDragEnter( 114 WebContents* source, 115 const DropData& data, 116 WebKit::WebDragOperationsMask operations_allowed) { 117 return true; 118 } 119 120 bool WebContentsDelegate::OnGoToEntryOffset(int offset) { 121 return true; 122 } 123 124 bool WebContentsDelegate::ShouldCreateWebContents( 125 WebContents* web_contents, 126 int route_id, 127 WindowContainerType window_container_type, 128 const string16& frame_name, 129 const GURL& target_url, 130 const Referrer& referrer, 131 WindowOpenDisposition disposition, 132 const WebKit::WebWindowFeatures& features, 133 bool user_gesture, 134 bool opener_suppressed) { 135 return true; 136 } 137 138 JavaScriptDialogManager* WebContentsDelegate::GetJavaScriptDialogManager() { 139 return NULL; 140 } 141 142 bool WebContentsDelegate::IsFullscreenForTabOrPending( 143 const WebContents* web_contents) const { 144 return false; 145 } 146 147 content::ColorChooser* WebContentsDelegate::OpenColorChooser( 148 WebContents* web_contents, SkColor color) { 149 return NULL; 150 } 151 152 void WebContentsDelegate::RequestMediaAccessPermission( 153 WebContents* web_contents, 154 const MediaStreamRequest& request, 155 const MediaResponseCallback& callback) { 156 callback.Run(MediaStreamDevices(), scoped_ptr<MediaStreamUI>()); 157 } 158 159 bool WebContentsDelegate::RequestPpapiBrokerPermission( 160 WebContents* web_contents, 161 const GURL& url, 162 const base::FilePath& plugin_path, 163 const base::Callback<void(bool)>& callback) { 164 return false; 165 } 166 167 WebContentsDelegate::~WebContentsDelegate() { 168 while (!attached_contents_.empty()) { 169 WebContents* web_contents = *attached_contents_.begin(); 170 web_contents->SetDelegate(NULL); 171 } 172 DCHECK(attached_contents_.empty()); 173 } 174 175 void WebContentsDelegate::Attach(WebContents* web_contents) { 176 DCHECK(attached_contents_.find(web_contents) == attached_contents_.end()); 177 attached_contents_.insert(web_contents); 178 } 179 180 void WebContentsDelegate::Detach(WebContents* web_contents) { 181 DCHECK(attached_contents_.find(web_contents) != attached_contents_.end()); 182 attached_contents_.erase(web_contents); 183 } 184 185 } // namespace content 186