OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 #include "content/renderer/accessibility/renderer_accessibility.h" | 51 #include "content/renderer/accessibility/renderer_accessibility.h" |
52 #include "content/renderer/accessibility/renderer_accessibility_complete.h" | 52 #include "content/renderer/accessibility/renderer_accessibility_complete.h" |
53 #include "content/renderer/accessibility/renderer_accessibility_focus_only.h" | 53 #include "content/renderer/accessibility/renderer_accessibility_focus_only.h" |
54 #include "content/renderer/browser_plugin/browser_plugin.h" | 54 #include "content/renderer/browser_plugin/browser_plugin.h" |
55 #include "content/renderer/browser_plugin/browser_plugin_manager.h" | 55 #include "content/renderer/browser_plugin/browser_plugin_manager.h" |
56 #include "content/renderer/child_frame_compositing_helper.h" | 56 #include "content/renderer/child_frame_compositing_helper.h" |
57 #include "content/renderer/context_menu_params_builder.h" | 57 #include "content/renderer/context_menu_params_builder.h" |
58 #include "content/renderer/devtools/devtools_agent.h" | 58 #include "content/renderer/devtools/devtools_agent.h" |
59 #include "content/renderer/dom_automation_controller.h" | 59 #include "content/renderer/dom_automation_controller.h" |
60 #include "content/renderer/dom_utils.h" | 60 #include "content/renderer/dom_utils.h" |
| 61 #include "content/renderer/external_popup_menu.h" |
61 #include "content/renderer/geolocation_dispatcher.h" | 62 #include "content/renderer/geolocation_dispatcher.h" |
62 #include "content/renderer/history_controller.h" | 63 #include "content/renderer/history_controller.h" |
63 #include "content/renderer/history_serialization.h" | 64 #include "content/renderer/history_serialization.h" |
64 #include "content/renderer/image_loading_helper.h" | 65 #include "content/renderer/image_loading_helper.h" |
65 #include "content/renderer/ime_event_guard.h" | 66 #include "content/renderer/ime_event_guard.h" |
66 #include "content/renderer/internal_document_state_data.h" | 67 #include "content/renderer/internal_document_state_data.h" |
67 #include "content/renderer/media/audio_renderer_mixer_manager.h" | 68 #include "content/renderer/media/audio_renderer_mixer_manager.h" |
68 #include "content/renderer/media/media_stream_dispatcher.h" | 69 #include "content/renderer/media/media_stream_dispatcher.h" |
69 #include "content/renderer/media/media_stream_impl.h" | 70 #include "content/renderer/media/media_stream_impl.h" |
70 #include "content/renderer/media/media_stream_renderer_factory.h" | 71 #include "content/renderer/media/media_stream_renderer_factory.h" |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
715 // In most cases, send IPCs through the proxy when swapped out. In some | 716 // In most cases, send IPCs through the proxy when swapped out. In some |
716 // calls the associated RenderViewImpl routing id is used to send | 717 // calls the associated RenderViewImpl routing id is used to send |
717 // messages, so don't use the proxy. | 718 // messages, so don't use the proxy. |
718 if (render_frame_proxy_ && message->routing_id() == routing_id_) | 719 if (render_frame_proxy_ && message->routing_id() == routing_id_) |
719 return render_frame_proxy_->Send(message); | 720 return render_frame_proxy_->Send(message); |
720 } | 721 } |
721 | 722 |
722 return RenderThread::Get()->Send(message); | 723 return RenderThread::Get()->Send(message); |
723 } | 724 } |
724 | 725 |
| 726 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
| 727 void RenderFrameImpl::DidHideExternalPopupMenu() { |
| 728 // We need to clear external_popup_menu_ as soon as ExternalPopupMenu::close |
| 729 // is called. Otherwise, createExternalPopupMenu() for new popup will fail. |
| 730 external_popup_menu_.reset(); |
| 731 } |
| 732 #endif |
| 733 |
725 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { | 734 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { |
726 // TODO(kenrb): document() should not be null, but as a transitional step | 735 // TODO(kenrb): document() should not be null, but as a transitional step |
727 // we have RenderFrameProxy 'wrapping' a RenderFrameImpl, passing messages | 736 // we have RenderFrameProxy 'wrapping' a RenderFrameImpl, passing messages |
728 // to this method. This happens for a top-level remote frame, where a | 737 // to this method. This happens for a top-level remote frame, where a |
729 // document-less RenderFrame is replaced by a RenderFrameProxy but kept | 738 // document-less RenderFrame is replaced by a RenderFrameProxy but kept |
730 // around and is still able to receive messages. | 739 // around and is still able to receive messages. |
731 if (!frame_->document().isNull()) | 740 if (!frame_->document().isNull()) |
732 GetContentClient()->SetActiveURL(frame_->document().url()); | 741 GetContentClient()->SetActiveURL(frame_->document().url()); |
733 | 742 |
734 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); | 743 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 OnSetEditableSelectionOffsets) | 779 OnSetEditableSelectionOffsets) |
771 IPC_MESSAGE_HANDLER(FrameMsg_SetupTransitionView, OnSetupTransitionView) | 780 IPC_MESSAGE_HANDLER(FrameMsg_SetupTransitionView, OnSetupTransitionView) |
772 IPC_MESSAGE_HANDLER(FrameMsg_BeginExitTransition, OnBeginExitTransition) | 781 IPC_MESSAGE_HANDLER(FrameMsg_BeginExitTransition, OnBeginExitTransition) |
773 IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload) | 782 IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload) |
774 IPC_MESSAGE_HANDLER(FrameMsg_TextSurroundingSelectionRequest, | 783 IPC_MESSAGE_HANDLER(FrameMsg_TextSurroundingSelectionRequest, |
775 OnTextSurroundingSelectionRequest) | 784 OnTextSurroundingSelectionRequest) |
776 IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL, | 785 IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL, |
777 OnAddStyleSheetByURL) | 786 OnAddStyleSheetByURL) |
778 IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode, | 787 IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode, |
779 OnSetAccessibilityMode) | 788 OnSetAccessibilityMode) |
780 #if defined(OS_MACOSX) | 789 #if defined(OS_ANDROID) |
| 790 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems) |
| 791 #elif defined(OS_MACOSX) |
| 792 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem) |
781 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) | 793 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) |
782 #endif | 794 #endif |
783 IPC_END_MESSAGE_MAP() | 795 IPC_END_MESSAGE_MAP() |
784 | 796 |
785 return handled; | 797 return handled; |
786 } | 798 } |
787 | 799 |
788 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { | 800 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { |
789 MaybeHandleDebugURL(params.url); | 801 MaybeHandleDebugURL(params.url); |
790 if (!render_view_->webview()) | 802 if (!render_view_->webview()) |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1265 return; | 1277 return; |
1266 | 1278 |
1267 if (accessibility_mode_ & AccessibilityModeFlagFullTree) | 1279 if (accessibility_mode_ & AccessibilityModeFlagFullTree) |
1268 renderer_accessibility_ = new RendererAccessibilityComplete(this); | 1280 renderer_accessibility_ = new RendererAccessibilityComplete(this); |
1269 #if !defined(OS_ANDROID) | 1281 #if !defined(OS_ANDROID) |
1270 else | 1282 else |
1271 renderer_accessibility_ = new RendererAccessibilityFocusOnly(this); | 1283 renderer_accessibility_ = new RendererAccessibilityFocusOnly(this); |
1272 #endif | 1284 #endif |
1273 } | 1285 } |
1274 | 1286 |
| 1287 #if defined(OS_ANDROID) |
| 1288 void RenderFrameImpl::OnSelectPopupMenuItems( |
| 1289 bool canceled, |
| 1290 const std::vector<int>& selected_indices) { |
| 1291 // It is possible to receive more than one of these calls if the user presses |
| 1292 // a select faster than it takes for the show-select-popup IPC message to make |
| 1293 // it to the browser UI thread. Ignore the extra-messages. |
| 1294 // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug. |
| 1295 if (!external_popup_menu_) |
| 1296 return; |
| 1297 |
| 1298 external_popup_menu_->DidSelectItems(canceled, selected_indices); |
| 1299 external_popup_menu_.reset(); |
| 1300 } |
| 1301 #endif |
| 1302 |
| 1303 #if defined(OS_MACOSX) |
| 1304 void RenderFrameImpl::OnSelectPopupMenuItem(int selected_index) { |
| 1305 if (external_popup_menu_ == NULL) |
| 1306 return; |
| 1307 external_popup_menu_->DidSelectItem(selected_index); |
| 1308 external_popup_menu_.reset(); |
| 1309 } |
| 1310 #endif |
| 1311 |
1275 void RenderFrameImpl::OnReload(bool ignore_cache) { | 1312 void RenderFrameImpl::OnReload(bool ignore_cache) { |
1276 frame_->reload(ignore_cache); | 1313 frame_->reload(ignore_cache); |
1277 } | 1314 } |
1278 | 1315 |
1279 void RenderFrameImpl::OnTextSurroundingSelectionRequest(size_t max_length) { | 1316 void RenderFrameImpl::OnTextSurroundingSelectionRequest(size_t max_length) { |
1280 blink::WebSurroundingText surroundingText; | 1317 blink::WebSurroundingText surroundingText; |
1281 surroundingText.initialize(frame_->selectionRange(), max_length); | 1318 surroundingText.initialize(frame_->selectionRange(), max_length); |
1282 | 1319 |
1283 if (surroundingText.isNull()) { | 1320 if (surroundingText.isNull()) { |
1284 // |surroundingText| might not be correctly initialized, for example if | 1321 // |surroundingText| might not be correctly initialized, for example if |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1561 if (!frame || !frame->view()) | 1598 if (!frame || !frame->view()) |
1562 return NULL; | 1599 return NULL; |
1563 DCHECK(!frame_ || frame_ == frame); | 1600 DCHECK(!frame_ || frame_ == frame); |
1564 return GetContentClient()->renderer()->CreateWorkerPermissionClientProxy( | 1601 return GetContentClient()->renderer()->CreateWorkerPermissionClientProxy( |
1565 this, frame); | 1602 this, frame); |
1566 } | 1603 } |
1567 | 1604 |
1568 WebExternalPopupMenu* RenderFrameImpl::createExternalPopupMenu( | 1605 WebExternalPopupMenu* RenderFrameImpl::createExternalPopupMenu( |
1569 const WebPopupMenuInfo& popup_menu_info, | 1606 const WebPopupMenuInfo& popup_menu_info, |
1570 WebExternalPopupMenuClient* popup_menu_client) { | 1607 WebExternalPopupMenuClient* popup_menu_client) { |
1571 return render_view_->createExternalPopupMenu(popup_menu_info, | 1608 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
1572 popup_menu_client); | 1609 // An IPC message is sent to the browser to build and display the actual |
| 1610 // popup. The user could have time to click a different select by the time |
| 1611 // the popup is shown. In that case external_popup_menu_ is non NULL. |
| 1612 // By returning NULL in that case, we instruct Blink to cancel that new |
| 1613 // popup. So from the user perspective, only the first one will show, and |
| 1614 // will have to close the first one before another one can be shown. |
| 1615 if (external_popup_menu_) |
| 1616 return NULL; |
| 1617 external_popup_menu_.reset( |
| 1618 new ExternalPopupMenu(this, popup_menu_info, popup_menu_client)); |
| 1619 if (render_view_->screen_metrics_emulator_) { |
| 1620 render_view_->SetExternalPopupOriginAdjustmentsForEmulation( |
| 1621 external_popup_menu_.get(), |
| 1622 render_view_->screen_metrics_emulator_.get()); |
| 1623 } |
| 1624 return external_popup_menu_.get(); |
| 1625 #else |
| 1626 return NULL; |
| 1627 #endif |
1573 } | 1628 } |
1574 | 1629 |
1575 blink::WebCookieJar* RenderFrameImpl::cookieJar(blink::WebLocalFrame* frame) { | 1630 blink::WebCookieJar* RenderFrameImpl::cookieJar(blink::WebLocalFrame* frame) { |
1576 DCHECK(!frame_ || frame_ == frame); | 1631 DCHECK(!frame_ || frame_ == frame); |
1577 return &cookie_jar_; | 1632 return &cookie_jar_; |
1578 } | 1633 } |
1579 | 1634 |
1580 blink::WebServiceWorkerProvider* RenderFrameImpl::createServiceWorkerProvider( | 1635 blink::WebServiceWorkerProvider* RenderFrameImpl::createServiceWorkerProvider( |
1581 blink::WebLocalFrame* frame) { | 1636 blink::WebLocalFrame* frame) { |
1582 DCHECK(!frame_ || frame_ == frame); | 1637 DCHECK(!frame_ || frame_ == frame); |
(...skipping 2169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3752 | 3807 |
3753 #if defined(ENABLE_BROWSER_CDMS) | 3808 #if defined(ENABLE_BROWSER_CDMS) |
3754 RendererCdmManager* RenderFrameImpl::GetCdmManager() { | 3809 RendererCdmManager* RenderFrameImpl::GetCdmManager() { |
3755 if (!cdm_manager_) | 3810 if (!cdm_manager_) |
3756 cdm_manager_ = new RendererCdmManager(this); | 3811 cdm_manager_ = new RendererCdmManager(this); |
3757 return cdm_manager_; | 3812 return cdm_manager_; |
3758 } | 3813 } |
3759 #endif // defined(ENABLE_BROWSER_CDMS) | 3814 #endif // defined(ENABLE_BROWSER_CDMS) |
3760 | 3815 |
3761 } // namespace content | 3816 } // namespace content |
OLD | NEW |