OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/guest_view/web_view/web_view_guest.h" | 5 #include "chrome/browser/guest_view/web_view/web_view_guest.h" |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 } | 170 } |
171 | 171 |
172 } // namespace | 172 } // namespace |
173 | 173 |
174 WebViewGuest::WebViewGuest(int guest_instance_id, | 174 WebViewGuest::WebViewGuest(int guest_instance_id, |
175 WebContents* guest_web_contents, | 175 WebContents* guest_web_contents, |
176 const std::string& embedder_extension_id) | 176 const std::string& embedder_extension_id) |
177 : GuestView<WebViewGuest>(guest_instance_id, | 177 : GuestView<WebViewGuest>(guest_instance_id, |
178 guest_web_contents, | 178 guest_web_contents, |
179 embedder_extension_id), | 179 embedder_extension_id), |
180 WebContentsObserver(guest_web_contents), | |
181 script_executor_(new extensions::ScriptExecutor(guest_web_contents, | 180 script_executor_(new extensions::ScriptExecutor(guest_web_contents, |
182 &script_observers_)), | 181 &script_observers_)), |
183 pending_context_menu_request_id_(0), | 182 pending_context_menu_request_id_(0), |
184 next_permission_request_id_(0), | 183 next_permission_request_id_(0), |
185 is_overriding_user_agent_(false), | 184 is_overriding_user_agent_(false), |
186 pending_reload_on_attachment_(false), | 185 pending_reload_on_attachment_(false), |
187 main_frame_id_(0), | 186 main_frame_id_(0), |
188 chromevox_injected_(false), | 187 chromevox_injected_(false), |
189 find_helper_(this), | 188 find_helper_(this), |
190 javascript_dialog_helper_(this) { | 189 javascript_dialog_helper_(this) { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 SetUserAgentOverride(user_agent_override); | 326 SetUserAgentOverride(user_agent_override); |
328 } else { | 327 } else { |
329 SetUserAgentOverride(""); | 328 SetUserAgentOverride(""); |
330 } | 329 } |
331 | 330 |
332 GuestViewBase::Attach(embedder_web_contents, args); | 331 GuestViewBase::Attach(embedder_web_contents, args); |
333 | 332 |
334 AddWebViewToExtensionRendererState(); | 333 AddWebViewToExtensionRendererState(); |
335 } | 334 } |
336 | 335 |
337 bool WebViewGuest::HandleContextMenu( | 336 void WebViewGuest::EmbedderDestroyed() { |
338 const content::ContextMenuParams& params) { | 337 // TODO(fsamuel): WebRequest event listeners for <webview> should survive |
339 ContextMenuDelegate* menu_delegate = | 338 // reparenting of a <webview> within a single embedder. Right now, we keep |
340 ContextMenuDelegate::FromWebContents(guest_web_contents()); | 339 // around the browser state for the listener for the lifetime of the embedder. |
341 DCHECK(menu_delegate); | 340 // Ideally, the lifetime of the listeners should match the lifetime of the |
342 | 341 // <webview> DOM node. Once http://crbug.com/156219 is resolved we can move |
343 pending_menu_ = menu_delegate->BuildMenu(guest_web_contents(), params); | 342 // the call to RemoveWebViewEventListenersOnIOThread back to |
344 | 343 // WebViewGuest::WebContentsDestroyed. |
345 // Pass it to embedder. | 344 content::BrowserThread::PostTask( |
346 int request_id = ++pending_context_menu_request_id_; | 345 content::BrowserThread::IO, |
347 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); | 346 FROM_HERE, |
348 scoped_ptr<base::ListValue> items = | 347 base::Bind( |
349 MenuModelToValue(pending_menu_->menu_model()); | 348 &RemoveWebViewEventListenersOnIOThread, |
350 args->Set(webview::kContextMenuItems, items.release()); | 349 browser_context(), embedder_extension_id(), |
351 args->SetInteger(webview::kRequestId, request_id); | 350 embedder_render_process_id(), |
352 DispatchEvent(new GuestViewBase::Event(webview::kEventContextMenu, | 351 view_instance_id())); |
353 args.Pass())); | |
354 return true; | |
355 } | 352 } |
356 | 353 |
357 bool WebViewGuest::AddMessageToConsole(WebContents* source, | 354 bool WebViewGuest::AddMessageToConsole(WebContents* source, |
358 int32 level, | 355 int32 level, |
359 const base::string16& message, | 356 const base::string16& message, |
360 int32 line_no, | 357 int32 line_no, |
361 const base::string16& source_id) { | 358 const base::string16& source_id) { |
362 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); | 359 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
363 // Log levels are from base/logging.h: LogSeverity. | 360 // Log levels are from base/logging.h: LogSeverity. |
364 args->SetInteger(webview::kLevel, level); | 361 args->SetInteger(webview::kLevel, level); |
(...skipping 29 matching lines...) Expand all Loading... |
394 // lifetime of the new guest is no longer managed by the opener guest. | 391 // lifetime of the new guest is no longer managed by the opener guest. |
395 GetOpener()->pending_new_windows_.erase(this); | 392 GetOpener()->pending_new_windows_.erase(this); |
396 } | 393 } |
397 | 394 |
398 if (pending_reload_on_attachment_) { | 395 if (pending_reload_on_attachment_) { |
399 pending_reload_on_attachment_ = false; | 396 pending_reload_on_attachment_ = false; |
400 guest_web_contents()->GetController().Reload(false); | 397 guest_web_contents()->GetController().Reload(false); |
401 } | 398 } |
402 } | 399 } |
403 | 400 |
404 void WebViewGuest::EmbedderDestroyed() { | |
405 // TODO(fsamuel): WebRequest event listeners for <webview> should survive | |
406 // reparenting of a <webview> within a single embedder. Right now, we keep | |
407 // around the browser state for the listener for the lifetime of the embedder. | |
408 // Ideally, the lifetime of the listeners should match the lifetime of the | |
409 // <webview> DOM node. Once http://crbug.com/156219 is resolved we can move | |
410 // the call to RemoveWebViewEventListenersOnIOThread back to | |
411 // WebViewGuest::WebContentsDestroyed. | |
412 content::BrowserThread::PostTask( | |
413 content::BrowserThread::IO, | |
414 FROM_HERE, | |
415 base::Bind( | |
416 &RemoveWebViewEventListenersOnIOThread, | |
417 browser_context(), embedder_extension_id(), | |
418 embedder_render_process_id(), | |
419 view_instance_id())); | |
420 } | |
421 | |
422 void WebViewGuest::FindReply(WebContents* source, | 401 void WebViewGuest::FindReply(WebContents* source, |
423 int request_id, | 402 int request_id, |
424 int number_of_matches, | 403 int number_of_matches, |
425 const gfx::Rect& selection_rect, | 404 const gfx::Rect& selection_rect, |
426 int active_match_ordinal, | 405 int active_match_ordinal, |
427 bool final_update) { | 406 bool final_update) { |
428 find_helper_.FindReply(request_id, number_of_matches, selection_rect, | 407 find_helper_.FindReply(request_id, number_of_matches, selection_rect, |
429 active_match_ordinal, final_update); | 408 active_match_ordinal, final_update); |
430 } | 409 } |
431 | 410 |
| 411 bool WebViewGuest::HandleContextMenu( |
| 412 const content::ContextMenuParams& params) { |
| 413 ContextMenuDelegate* menu_delegate = |
| 414 ContextMenuDelegate::FromWebContents(guest_web_contents()); |
| 415 DCHECK(menu_delegate); |
| 416 |
| 417 pending_menu_ = menu_delegate->BuildMenu(guest_web_contents(), params); |
| 418 |
| 419 // Pass it to embedder. |
| 420 int request_id = ++pending_context_menu_request_id_; |
| 421 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| 422 scoped_ptr<base::ListValue> items = |
| 423 MenuModelToValue(pending_menu_->menu_model()); |
| 424 args->Set(webview::kContextMenuItems, items.release()); |
| 425 args->SetInteger(webview::kRequestId, request_id); |
| 426 DispatchEvent(new GuestViewBase::Event(webview::kEventContextMenu, |
| 427 args.Pass())); |
| 428 return true; |
| 429 } |
| 430 |
432 void WebViewGuest::HandleKeyboardEvent( | 431 void WebViewGuest::HandleKeyboardEvent( |
433 WebContents* source, | 432 WebContents* source, |
434 const content::NativeWebKeyboardEvent& event) { | 433 const content::NativeWebKeyboardEvent& event) { |
435 if (!attached()) | 434 if (!attached()) |
436 return; | 435 return; |
437 | 436 |
438 if (HandleKeyboardShortcuts(event)) | 437 if (HandleKeyboardShortcuts(event)) |
439 return; | 438 return; |
440 | 439 |
441 // Send the unhandled keyboard events back to the embedder to reprocess them. | 440 // Send the unhandled keyboard events back to the embedder to reprocess them. |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
876 } | 875 } |
877 | 876 |
878 void WebViewGuest::WebContentsDestroyed() { | 877 void WebViewGuest::WebContentsDestroyed() { |
879 // Clean up custom context menu items for this guest. | 878 // Clean up custom context menu items for this guest. |
880 extensions::MenuManager* menu_manager = extensions::MenuManager::Get( | 879 extensions::MenuManager* menu_manager = extensions::MenuManager::Get( |
881 Profile::FromBrowserContext(browser_context())); | 880 Profile::FromBrowserContext(browser_context())); |
882 menu_manager->RemoveAllContextItems(extensions::MenuItem::ExtensionKey( | 881 menu_manager->RemoveAllContextItems(extensions::MenuItem::ExtensionKey( |
883 embedder_extension_id(), view_instance_id())); | 882 embedder_extension_id(), view_instance_id())); |
884 | 883 |
885 RemoveWebViewFromExtensionRendererState(web_contents()); | 884 RemoveWebViewFromExtensionRendererState(web_contents()); |
| 885 GuestViewBase::WebContentsDestroyed(); |
886 } | 886 } |
887 | 887 |
888 void WebViewGuest::UserAgentOverrideSet(const std::string& user_agent) { | 888 void WebViewGuest::UserAgentOverrideSet(const std::string& user_agent) { |
889 content::NavigationController& controller = | 889 content::NavigationController& controller = |
890 guest_web_contents()->GetController(); | 890 guest_web_contents()->GetController(); |
891 content::NavigationEntry* entry = controller.GetVisibleEntry(); | 891 content::NavigationEntry* entry = controller.GetVisibleEntry(); |
892 if (!entry) | 892 if (!entry) |
893 return; | 893 return; |
894 entry->SetIsOverridingUserAgent(!user_agent.empty()); | 894 entry->SetIsOverridingUserAgent(!user_agent.empty()); |
895 if (!attached()) { | 895 if (!attached()) { |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1409 bool allow, | 1409 bool allow, |
1410 const std::string& user_input) { | 1410 const std::string& user_input) { |
1411 WebViewGuest* guest = | 1411 WebViewGuest* guest = |
1412 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); | 1412 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); |
1413 if (!guest) | 1413 if (!guest) |
1414 return; | 1414 return; |
1415 | 1415 |
1416 if (!allow) | 1416 if (!allow) |
1417 guest->Destroy(); | 1417 guest->Destroy(); |
1418 } | 1418 } |
OLD | NEW |