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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener) | 789 IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener) |
781 #if defined(OS_MACOSX) | 790 #if defined(OS_ANDROID) |
| 791 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems) |
| 792 #elif defined(OS_MACOSX) |
| 793 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem) |
782 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) | 794 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) |
783 #endif | 795 #endif |
784 IPC_END_MESSAGE_MAP() | 796 IPC_END_MESSAGE_MAP() |
785 | 797 |
786 return handled; | 798 return handled; |
787 } | 799 } |
788 | 800 |
789 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { | 801 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { |
790 MaybeHandleDebugURL(params.url); | 802 MaybeHandleDebugURL(params.url); |
791 if (!render_view_->webview()) | 803 if (!render_view_->webview()) |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 void RenderFrameImpl::OnDisownOpener() { | 1288 void RenderFrameImpl::OnDisownOpener() { |
1277 // TODO(creis): We should only see this for main frames for now. To support | 1289 // TODO(creis): We should only see this for main frames for now. To support |
1278 // disowning the opener on subframes, we will need to move WebContentsImpl's | 1290 // disowning the opener on subframes, we will need to move WebContentsImpl's |
1279 // opener_ to FrameTreeNode. | 1291 // opener_ to FrameTreeNode. |
1280 CHECK(!frame_->parent()); | 1292 CHECK(!frame_->parent()); |
1281 | 1293 |
1282 if (frame_->opener()) | 1294 if (frame_->opener()) |
1283 frame_->setOpener(NULL); | 1295 frame_->setOpener(NULL); |
1284 } | 1296 } |
1285 | 1297 |
| 1298 #if defined(OS_ANDROID) |
| 1299 void RenderFrameImpl::OnSelectPopupMenuItems( |
| 1300 bool canceled, |
| 1301 const std::vector<int>& selected_indices) { |
| 1302 // It is possible to receive more than one of these calls if the user presses |
| 1303 // a select faster than it takes for the show-select-popup IPC message to make |
| 1304 // it to the browser UI thread. Ignore the extra-messages. |
| 1305 // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug. |
| 1306 if (!external_popup_menu_) |
| 1307 return; |
| 1308 |
| 1309 external_popup_menu_->DidSelectItems(canceled, selected_indices); |
| 1310 external_popup_menu_.reset(); |
| 1311 } |
| 1312 #endif |
| 1313 |
| 1314 #if defined(OS_MACOSX) |
| 1315 void RenderFrameImpl::OnSelectPopupMenuItem(int selected_index) { |
| 1316 if (external_popup_menu_ == NULL) |
| 1317 return; |
| 1318 external_popup_menu_->DidSelectItem(selected_index); |
| 1319 external_popup_menu_.reset(); |
| 1320 } |
| 1321 #endif |
| 1322 |
1286 void RenderFrameImpl::OnReload(bool ignore_cache) { | 1323 void RenderFrameImpl::OnReload(bool ignore_cache) { |
1287 frame_->reload(ignore_cache); | 1324 frame_->reload(ignore_cache); |
1288 } | 1325 } |
1289 | 1326 |
1290 void RenderFrameImpl::OnTextSurroundingSelectionRequest(size_t max_length) { | 1327 void RenderFrameImpl::OnTextSurroundingSelectionRequest(size_t max_length) { |
1291 blink::WebSurroundingText surroundingText; | 1328 blink::WebSurroundingText surroundingText; |
1292 surroundingText.initialize(frame_->selectionRange(), max_length); | 1329 surroundingText.initialize(frame_->selectionRange(), max_length); |
1293 | 1330 |
1294 if (surroundingText.isNull()) { | 1331 if (surroundingText.isNull()) { |
1295 // |surroundingText| might not be correctly initialized, for example if | 1332 // |surroundingText| might not be correctly initialized, for example if |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1572 if (!frame || !frame->view()) | 1609 if (!frame || !frame->view()) |
1573 return NULL; | 1610 return NULL; |
1574 DCHECK(!frame_ || frame_ == frame); | 1611 DCHECK(!frame_ || frame_ == frame); |
1575 return GetContentClient()->renderer()->CreateWorkerPermissionClientProxy( | 1612 return GetContentClient()->renderer()->CreateWorkerPermissionClientProxy( |
1576 this, frame); | 1613 this, frame); |
1577 } | 1614 } |
1578 | 1615 |
1579 WebExternalPopupMenu* RenderFrameImpl::createExternalPopupMenu( | 1616 WebExternalPopupMenu* RenderFrameImpl::createExternalPopupMenu( |
1580 const WebPopupMenuInfo& popup_menu_info, | 1617 const WebPopupMenuInfo& popup_menu_info, |
1581 WebExternalPopupMenuClient* popup_menu_client) { | 1618 WebExternalPopupMenuClient* popup_menu_client) { |
1582 return render_view_->createExternalPopupMenu(popup_menu_info, | 1619 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
1583 popup_menu_client); | 1620 // An IPC message is sent to the browser to build and display the actual |
| 1621 // popup. The user could have time to click a different select by the time |
| 1622 // the popup is shown. In that case external_popup_menu_ is non NULL. |
| 1623 // By returning NULL in that case, we instruct Blink to cancel that new |
| 1624 // popup. So from the user perspective, only the first one will show, and |
| 1625 // will have to close the first one before another one can be shown. |
| 1626 if (external_popup_menu_) |
| 1627 return NULL; |
| 1628 external_popup_menu_.reset( |
| 1629 new ExternalPopupMenu(this, popup_menu_info, popup_menu_client)); |
| 1630 if (render_view_->screen_metrics_emulator_) { |
| 1631 render_view_->SetExternalPopupOriginAdjustmentsForEmulation( |
| 1632 external_popup_menu_.get(), |
| 1633 render_view_->screen_metrics_emulator_.get()); |
| 1634 } |
| 1635 return external_popup_menu_.get(); |
| 1636 #else |
| 1637 return NULL; |
| 1638 #endif |
1584 } | 1639 } |
1585 | 1640 |
1586 blink::WebCookieJar* RenderFrameImpl::cookieJar(blink::WebLocalFrame* frame) { | 1641 blink::WebCookieJar* RenderFrameImpl::cookieJar(blink::WebLocalFrame* frame) { |
1587 DCHECK(!frame_ || frame_ == frame); | 1642 DCHECK(!frame_ || frame_ == frame); |
1588 return &cookie_jar_; | 1643 return &cookie_jar_; |
1589 } | 1644 } |
1590 | 1645 |
1591 blink::WebServiceWorkerProvider* RenderFrameImpl::createServiceWorkerProvider( | 1646 blink::WebServiceWorkerProvider* RenderFrameImpl::createServiceWorkerProvider( |
1592 blink::WebLocalFrame* frame) { | 1647 blink::WebLocalFrame* frame) { |
1593 DCHECK(!frame_ || frame_ == frame); | 1648 DCHECK(!frame_ || frame_ == frame); |
(...skipping 2171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3765 | 3820 |
3766 #if defined(ENABLE_BROWSER_CDMS) | 3821 #if defined(ENABLE_BROWSER_CDMS) |
3767 RendererCdmManager* RenderFrameImpl::GetCdmManager() { | 3822 RendererCdmManager* RenderFrameImpl::GetCdmManager() { |
3768 if (!cdm_manager_) | 3823 if (!cdm_manager_) |
3769 cdm_manager_ = new RendererCdmManager(this); | 3824 cdm_manager_ = new RendererCdmManager(this); |
3770 return cdm_manager_; | 3825 return cdm_manager_; |
3771 } | 3826 } |
3772 #endif // defined(ENABLE_BROWSER_CDMS) | 3827 #endif // defined(ENABLE_BROWSER_CDMS) |
3773 | 3828 |
3774 } // namespace content | 3829 } // namespace content |
OLD | NEW |