Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(902)

Side by Side Diff: content/renderer/render_view_impl.cc

Issue 2050623005: Move file chooser from RenderView(Host) to RenderFrame(Host). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Some cleanup. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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_view_impl.h" 5 #include "content/renderer/render_view_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <memory> 9 #include <memory>
10 10
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 #include "content/common/page_messages.h" 54 #include "content/common/page_messages.h"
55 #include "content/common/site_isolation_policy.h" 55 #include "content/common/site_isolation_policy.h"
56 #include "content/common/ssl_status_serialization.h" 56 #include "content/common/ssl_status_serialization.h"
57 #include "content/common/view_messages.h" 57 #include "content/common/view_messages.h"
58 #include "content/public/common/bindings_policy.h" 58 #include "content/public/common/bindings_policy.h"
59 #include "content/public/common/content_client.h" 59 #include "content/public/common/content_client.h"
60 #include "content/public/common/content_constants.h" 60 #include "content/public/common/content_constants.h"
61 #include "content/public/common/content_switches.h" 61 #include "content/public/common/content_switches.h"
62 #include "content/public/common/drop_data.h" 62 #include "content/public/common/drop_data.h"
63 #include "content/public/common/favicon_url.h" 63 #include "content/public/common/favicon_url.h"
64 #include "content/public/common/file_chooser_file_info.h"
65 #include "content/public/common/file_chooser_params.h"
66 #include "content/public/common/page_importance_signals.h" 64 #include "content/public/common/page_importance_signals.h"
67 #include "content/public/common/page_state.h" 65 #include "content/public/common/page_state.h"
68 #include "content/public/common/page_zoom.h" 66 #include "content/public/common/page_zoom.h"
69 #include "content/public/common/ssl_status.h" 67 #include "content/public/common/ssl_status.h"
70 #include "content/public/common/three_d_api_types.h" 68 #include "content/public/common/three_d_api_types.h"
71 #include "content/public/common/url_constants.h" 69 #include "content/public/common/url_constants.h"
72 #include "content/public/common/web_preferences.h" 70 #include "content/public/common/web_preferences.h"
73 #include "content/public/renderer/content_renderer_client.h" 71 #include "content/public/renderer/content_renderer_client.h"
74 #include "content/public/renderer/document_state.h" 72 #include "content/public/renderer/document_state.h"
75 #include "content/public/renderer/navigation_state.h" 73 #include "content/public/renderer/navigation_state.h"
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 const blink::WebVector<blink::WebSize>& web_sizes, 383 const blink::WebVector<blink::WebSize>& web_sizes,
386 std::vector<gfx::Size>* sizes) { 384 std::vector<gfx::Size>* sizes) {
387 DCHECK(sizes->empty()); 385 DCHECK(sizes->empty());
388 sizes->reserve(web_sizes.size()); 386 sizes->reserve(web_sizes.size());
389 for (size_t i = 0; i < web_sizes.size(); ++i) 387 for (size_t i = 0; i < web_sizes.size(); ++i)
390 sizes->push_back(gfx::Size(web_sizes[i])); 388 sizes->push_back(gfx::Size(web_sizes[i]));
391 } 389 }
392 390
393 /////////////////////////////////////////////////////////////////////////////// 391 ///////////////////////////////////////////////////////////////////////////////
394 392
395 struct RenderViewImpl::PendingFileChooser {
396 PendingFileChooser(const FileChooserParams& p, WebFileChooserCompletion* c)
397 : params(p),
398 completion(c) {
399 }
400 FileChooserParams params;
401 WebFileChooserCompletion* completion; // MAY BE NULL to skip callback.
402 };
403
404 namespace { 393 namespace {
405 394
406 WebDragData DropDataToWebDragData(const DropData& drop_data) { 395 WebDragData DropDataToWebDragData(const DropData& drop_data) {
407 std::vector<WebDragData::Item> item_list; 396 std::vector<WebDragData::Item> item_list;
408 397
409 // These fields are currently unused when dragging into WebKit. 398 // These fields are currently unused when dragging into WebKit.
410 DCHECK(drop_data.download_metadata.empty()); 399 DCHECK(drop_data.download_metadata.empty());
411 DCHECK(drop_data.file_contents.empty()); 400 DCHECK(drop_data.file_contents.empty());
412 DCHECK(drop_data.file_description_filename.empty()); 401 DCHECK(drop_data.file_description_filename.empty());
413 402
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 } 791 }
803 792
804 RenderViewImpl::~RenderViewImpl() { 793 RenderViewImpl::~RenderViewImpl() {
805 DCHECK(!frame_widget_); 794 DCHECK(!frame_widget_);
806 795
807 for (BitmapMap::iterator it = disambiguation_bitmaps_.begin(); 796 for (BitmapMap::iterator it = disambiguation_bitmaps_.begin();
808 it != disambiguation_bitmaps_.end(); 797 it != disambiguation_bitmaps_.end();
809 ++it) 798 ++it)
810 delete it->second; 799 delete it->second;
811 800
812 // If file chooser is still waiting for answer, dispatch empty answer.
813 while (!file_chooser_completions_.empty()) {
814 if (file_chooser_completions_.front()->completion) {
815 file_chooser_completions_.front()->completion->didChooseFile(
816 WebVector<WebString>());
817 }
818 file_chooser_completions_.pop_front();
819 }
820
821 #if defined(OS_ANDROID) 801 #if defined(OS_ANDROID)
822 // The date/time picker client is both a std::unique_ptr member of this class 802 // The date/time picker client is both a std::unique_ptr member of this class
823 // and a RenderViewObserver. Reset it to prevent double deletion. 803 // and a RenderViewObserver. Reset it to prevent double deletion.
824 date_time_picker_client_.reset(); 804 date_time_picker_client_.reset();
825 #endif 805 #endif
826 806
827 #ifndef NDEBUG 807 #ifndef NDEBUG
828 // Make sure we are no longer referenced by the ViewMap or RoutingIDViewMap. 808 // Make sure we are no longer referenced by the ViewMap or RoutingIDViewMap.
829 ViewMap* views = g_view_map.Pointer(); 809 ViewMap* views = g_view_map.Pointer();
830 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) 810 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it)
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
1269 IPC_MESSAGE_HANDLER(DragMsg_TargetDrop, OnDragTargetDrop) 1249 IPC_MESSAGE_HANDLER(DragMsg_TargetDrop, OnDragTargetDrop)
1270 IPC_MESSAGE_HANDLER(DragMsg_SourceEnded, OnDragSourceEnded) 1250 IPC_MESSAGE_HANDLER(DragMsg_SourceEnded, OnDragSourceEnded)
1271 IPC_MESSAGE_HANDLER(DragMsg_SourceSystemDragEnded, 1251 IPC_MESSAGE_HANDLER(DragMsg_SourceSystemDragEnded,
1272 OnDragSourceSystemDragEnded) 1252 OnDragSourceSystemDragEnded)
1273 IPC_MESSAGE_HANDLER(ViewMsg_AllowBindings, OnAllowBindings) 1253 IPC_MESSAGE_HANDLER(ViewMsg_AllowBindings, OnAllowBindings)
1274 IPC_MESSAGE_HANDLER(ViewMsg_SetInitialFocus, OnSetInitialFocus) 1254 IPC_MESSAGE_HANDLER(ViewMsg_SetInitialFocus, OnSetInitialFocus)
1275 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTargetURL_ACK, OnUpdateTargetURLAck) 1255 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTargetURL_ACK, OnUpdateTargetURLAck)
1276 IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences) 1256 IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences)
1277 IPC_MESSAGE_HANDLER(ViewMsg_EnumerateDirectoryResponse, 1257 IPC_MESSAGE_HANDLER(ViewMsg_EnumerateDirectoryResponse,
1278 OnEnumerateDirectoryResponse) 1258 OnEnumerateDirectoryResponse)
1279 IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse)
1280 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage) 1259 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage)
1281 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged) 1260 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged)
1282 IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted) 1261 IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
1283 IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedElement, OnClearFocusedElement) 1262 IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedElement, OnClearFocusedElement)
1284 IPC_MESSAGE_HANDLER(ViewMsg_SetBackgroundOpaque, OnSetBackgroundOpaque) 1263 IPC_MESSAGE_HANDLER(ViewMsg_SetBackgroundOpaque, OnSetBackgroundOpaque)
1285 IPC_MESSAGE_HANDLER(ViewMsg_EnablePreferredSizeChangedMode, 1264 IPC_MESSAGE_HANDLER(ViewMsg_EnablePreferredSizeChangedMode,
1286 OnEnablePreferredSizeChangedMode) 1265 OnEnablePreferredSizeChangedMode)
1287 IPC_MESSAGE_HANDLER(ViewMsg_EnableAutoResize, OnEnableAutoResize) 1266 IPC_MESSAGE_HANDLER(ViewMsg_EnableAutoResize, OnEnableAutoResize)
1288 IPC_MESSAGE_HANDLER(ViewMsg_DisableAutoResize, OnDisableAutoResize) 1267 IPC_MESSAGE_HANDLER(ViewMsg_DisableAutoResize, OnDisableAutoResize)
1289 IPC_MESSAGE_HANDLER(ViewMsg_DisableScrollbarsForSmallWindows, 1268 IPC_MESSAGE_HANDLER(ViewMsg_DisableScrollbarsForSmallWindows,
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1660 // seems safest to not execute the rest. 1639 // seems safest to not execute the rest.
1661 if (!frame->executeCommand(WebString::fromUTF8(it->name), 1640 if (!frame->executeCommand(WebString::fromUTF8(it->name),
1662 WebString::fromUTF8(it->value))) 1641 WebString::fromUTF8(it->value)))
1663 break; 1642 break;
1664 did_execute_command = true; 1643 did_execute_command = true;
1665 } 1644 }
1666 1645
1667 return did_execute_command; 1646 return did_execute_command;
1668 } 1647 }
1669 1648
1670 bool RenderViewImpl::runFileChooser(
1671 const blink::WebFileChooserParams& params,
1672 WebFileChooserCompletion* chooser_completion) {
1673 // Do not open the file dialog in a hidden RenderView.
1674 if (is_hidden())
1675 return false;
1676 FileChooserParams ipc_params;
1677 if (params.directory)
1678 ipc_params.mode = FileChooserParams::UploadFolder;
1679 else if (params.multiSelect)
1680 ipc_params.mode = FileChooserParams::OpenMultiple;
1681 else if (params.saveAs)
1682 ipc_params.mode = FileChooserParams::Save;
1683 else
1684 ipc_params.mode = FileChooserParams::Open;
1685 ipc_params.title = params.title;
1686 ipc_params.default_file_name =
1687 blink::WebStringToFilePath(params.initialValue).BaseName();
1688 ipc_params.accept_types.reserve(params.acceptTypes.size());
1689 for (size_t i = 0; i < params.acceptTypes.size(); ++i)
1690 ipc_params.accept_types.push_back(params.acceptTypes[i]);
1691 ipc_params.need_local_path = params.needLocalPath;
1692 #if defined(OS_ANDROID)
1693 ipc_params.capture = params.useMediaCapture;
1694 #endif
1695 ipc_params.requestor = params.requestor;
1696
1697 return ScheduleFileChooser(ipc_params, chooser_completion);
1698 }
1699
1700 void RenderViewImpl::SetValidationMessageDirection( 1649 void RenderViewImpl::SetValidationMessageDirection(
1701 base::string16* wrapped_main_text, 1650 base::string16* wrapped_main_text,
1702 blink::WebTextDirection main_text_hint, 1651 blink::WebTextDirection main_text_hint,
1703 base::string16* wrapped_sub_text, 1652 base::string16* wrapped_sub_text,
1704 blink::WebTextDirection sub_text_hint) { 1653 blink::WebTextDirection sub_text_hint) {
1705 if (main_text_hint == blink::WebTextDirectionLeftToRight) { 1654 if (main_text_hint == blink::WebTextDirectionLeftToRight) {
1706 *wrapped_main_text = 1655 *wrapped_main_text =
1707 base::i18n::GetDisplayStringInLTRDirectionality(*wrapped_main_text); 1656 base::i18n::GetDisplayStringInLTRDirectionality(*wrapped_main_text);
1708 } else if (main_text_hint == blink::WebTextDirectionRightToLeft && 1657 } else if (main_text_hint == blink::WebTextDirectionRightToLeft &&
1709 !base::i18n::IsRTL()) { 1658 !base::i18n::IsRTL()) {
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after
2436 return; 2385 return;
2437 2386
2438 WebVector<WebString> ws_file_names(paths.size()); 2387 WebVector<WebString> ws_file_names(paths.size());
2439 for (size_t i = 0; i < paths.size(); ++i) 2388 for (size_t i = 0; i < paths.size(); ++i)
2440 ws_file_names[i] = paths[i].AsUTF16Unsafe(); 2389 ws_file_names[i] = paths[i].AsUTF16Unsafe();
2441 2390
2442 enumeration_completions_[id]->didChooseFile(ws_file_names); 2391 enumeration_completions_[id]->didChooseFile(ws_file_names);
2443 enumeration_completions_.erase(id); 2392 enumeration_completions_.erase(id);
2444 } 2393 }
2445 2394
2446 void RenderViewImpl::OnFileChooserResponse(
2447 const std::vector<content::FileChooserFileInfo>& files) {
2448 // This could happen if we navigated to a different page before the user
2449 // closed the chooser.
2450 if (file_chooser_completions_.empty())
2451 return;
2452
2453 // Convert Chrome's SelectedFileInfo list to WebKit's.
2454 WebVector<WebFileChooserCompletion::SelectedFileInfo> selected_files(
2455 files.size());
2456 for (size_t i = 0; i < files.size(); ++i) {
2457 WebFileChooserCompletion::SelectedFileInfo selected_file;
2458 selected_file.path = files[i].file_path.AsUTF16Unsafe();
2459 selected_file.displayName =
2460 base::FilePath(files[i].display_name).AsUTF16Unsafe();
2461 if (files[i].file_system_url.is_valid()) {
2462 selected_file.fileSystemURL = files[i].file_system_url;
2463 selected_file.length = files[i].length;
2464 selected_file.modificationTime = files[i].modification_time.ToDoubleT();
2465 selected_file.isDirectory = files[i].is_directory;
2466 }
2467 selected_files[i] = selected_file;
2468 }
2469
2470 if (file_chooser_completions_.front()->completion)
2471 file_chooser_completions_.front()->completion->didChooseFile(
2472 selected_files);
2473 file_chooser_completions_.pop_front();
2474
2475 // If there are more pending file chooser requests, schedule one now.
2476 if (!file_chooser_completions_.empty()) {
2477 Send(new ViewHostMsg_RunFileChooser(
2478 GetRoutingID(), file_chooser_completions_.front()->params));
2479 }
2480 }
2481
2482 void RenderViewImpl::OnEnableAutoResize(const gfx::Size& min_size, 2395 void RenderViewImpl::OnEnableAutoResize(const gfx::Size& min_size,
2483 const gfx::Size& max_size) { 2396 const gfx::Size& max_size) {
2484 DCHECK(disable_scrollbars_size_limit_.IsEmpty()); 2397 DCHECK(disable_scrollbars_size_limit_.IsEmpty());
2485 if (!webview()) 2398 if (!webview())
2486 return; 2399 return;
2487 2400
2488 auto_resize_mode_ = true; 2401 auto_resize_mode_ = true;
2489 if (IsUseZoomForDSFEnabled()) { 2402 if (IsUseZoomForDSFEnabled()) {
2490 webview()->enableAutoResizeMode( 2403 webview()->enableAutoResizeMode(
2491 gfx::ScaleToCeiledSize(min_size, device_scale_factor_), 2404 gfx::ScaleToCeiledSize(min_size, device_scale_factor_),
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
2950 bool enabled, 2863 bool enabled,
2951 const blink::WebDeviceEmulationParams& params) { 2864 const blink::WebDeviceEmulationParams& params) {
2952 if (webview() && compositor()) { 2865 if (webview() && compositor()) {
2953 if (enabled) 2866 if (enabled)
2954 webview()->enableDeviceEmulation(params); 2867 webview()->enableDeviceEmulation(params);
2955 else 2868 else
2956 webview()->disableDeviceEmulation(); 2869 webview()->disableDeviceEmulation();
2957 } 2870 }
2958 } 2871 }
2959 2872
2960 bool RenderViewImpl::ScheduleFileChooser(
2961 const FileChooserParams& params,
2962 WebFileChooserCompletion* completion) {
2963 static const size_t kMaximumPendingFileChooseRequests = 4;
2964 if (file_chooser_completions_.size() > kMaximumPendingFileChooseRequests) {
2965 // This sanity check prevents too many file choose requests from getting
2966 // queued which could DoS the user. Getting these is most likely a
2967 // programming error (there are many ways to DoS the user so it's not
2968 // considered a "real" security check), either in JS requesting many file
2969 // choosers to pop up, or in a plugin.
2970 //
2971 // TODO(brettw) we might possibly want to require a user gesture to open
2972 // a file picker, which will address this issue in a better way.
2973 return false;
2974 }
2975
2976 file_chooser_completions_.push_back(
2977 base::WrapUnique(new PendingFileChooser(params, completion)));
2978 if (file_chooser_completions_.size() == 1) {
2979 // Actually show the browse dialog when this is the first request.
2980 Send(new ViewHostMsg_RunFileChooser(GetRoutingID(), params));
2981 }
2982 return true;
2983 }
2984
2985 blink::WebSpeechRecognizer* RenderViewImpl::speechRecognizer() { 2873 blink::WebSpeechRecognizer* RenderViewImpl::speechRecognizer() {
2986 if (!speech_recognition_dispatcher_) 2874 if (!speech_recognition_dispatcher_)
2987 speech_recognition_dispatcher_ = new SpeechRecognitionDispatcher(this); 2875 speech_recognition_dispatcher_ = new SpeechRecognitionDispatcher(this);
2988 return speech_recognition_dispatcher_; 2876 return speech_recognition_dispatcher_;
2989 } 2877 }
2990 2878
2991 void RenderViewImpl::zoomLimitsChanged(double minimum_level, 2879 void RenderViewImpl::zoomLimitsChanged(double minimum_level,
2992 double maximum_level) { 2880 double maximum_level) {
2993 // Round the double to avoid returning incorrect minimum/maximum zoom 2881 // Round the double to avoid returning incorrect minimum/maximum zoom
2994 // percentages. 2882 // percentages.
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
3340 return render_frame->focused_pepper_plugin(); 3228 return render_frame->focused_pepper_plugin();
3341 } 3229 }
3342 frame = frame->traverseNext(false); 3230 frame = frame->traverseNext(false);
3343 } 3231 }
3344 3232
3345 return nullptr; 3233 return nullptr;
3346 } 3234 }
3347 #endif 3235 #endif
3348 3236
3349 } // namespace content 3237 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698