OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/renderer_host/render_view_host.h" | 5 #include "chrome/browser/renderer_host/render_view_host.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "app/resource_bundle.h" | 11 #include "app/resource_bundle.h" |
12 #include "base/i18n/rtl.h" | 12 #include "base/i18n/rtl.h" |
13 #include "base/json/json_reader.h" | 13 #include "base/json/json_reader.h" |
14 #include "base/stats_counters.h" | 14 #include "base/stats_counters.h" |
15 #include "base/string_util.h" | 15 #include "base/string_util.h" |
16 #include "base/time.h" | 16 #include "base/time.h" |
17 #include "base/waitable_event.h" | 17 #include "base/waitable_event.h" |
| 18 #include "chrome/browser/browser_process.h" |
18 #include "chrome/browser/child_process_security_policy.h" | 19 #include "chrome/browser/child_process_security_policy.h" |
19 #include "chrome/browser/cross_site_request_manager.h" | 20 #include "chrome/browser/cross_site_request_manager.h" |
| 21 #include "chrome/browser/chrome_thread.h" |
20 #include "chrome/browser/debugger/devtools_manager.h" | 22 #include "chrome/browser/debugger/devtools_manager.h" |
21 #include "chrome/browser/dom_operation_notification_details.h" | 23 #include "chrome/browser/dom_operation_notification_details.h" |
22 #include "chrome/browser/extensions/extension_message_service.h" | 24 #include "chrome/browser/extensions/extension_message_service.h" |
| 25 #include "chrome/browser/icon_manager.h" |
23 #include "chrome/browser/metrics/user_metrics.h" | 26 #include "chrome/browser/metrics/user_metrics.h" |
24 #include "chrome/browser/notifications/desktop_notification_service.h" | 27 #include "chrome/browser/notifications/desktop_notification_service.h" |
25 #include "chrome/browser/profile.h" | 28 #include "chrome/browser/profile.h" |
26 #include "chrome/browser/renderer_host/render_process_host.h" | 29 #include "chrome/browser/renderer_host/render_process_host.h" |
27 #include "chrome/browser/renderer_host/render_view_host_delegate.h" | 30 #include "chrome/browser/renderer_host/render_view_host_delegate.h" |
28 #include "chrome/browser/renderer_host/render_widget_host.h" | 31 #include "chrome/browser/renderer_host/render_widget_host.h" |
29 #include "chrome/browser/renderer_host/render_widget_host_view.h" | 32 #include "chrome/browser/renderer_host/render_widget_host_view.h" |
30 #include "chrome/browser/renderer_host/site_instance.h" | 33 #include "chrome/browser/renderer_host/site_instance.h" |
31 #include "chrome/common/bindings_policy.h" | 34 #include "chrome/common/bindings_policy.h" |
32 #include "chrome/common/notification_details.h" | 35 #include "chrome/common/notification_details.h" |
33 #include "chrome/common/notification_service.h" | 36 #include "chrome/common/notification_service.h" |
34 #include "chrome/common/notification_type.h" | 37 #include "chrome/common/notification_type.h" |
35 #include "chrome/common/render_messages.h" | 38 #include "chrome/common/render_messages.h" |
36 #include "chrome/common/result_codes.h" | 39 #include "chrome/common/result_codes.h" |
37 #include "chrome/common/chrome_constants.h" | 40 #include "chrome/common/chrome_constants.h" |
38 #include "chrome/common/net/url_request_context_getter.h" | 41 #include "chrome/common/net/url_request_context_getter.h" |
39 #include "chrome/common/thumbnail_score.h" | 42 #include "chrome/common/thumbnail_score.h" |
40 #include "chrome/common/translate_errors.h" | 43 #include "chrome/common/translate_errors.h" |
41 #include "chrome/common/url_constants.h" | 44 #include "chrome/common/url_constants.h" |
| 45 #include "gfx/codec/png_codec.h" |
42 #include "gfx/native_widget_types.h" | 46 #include "gfx/native_widget_types.h" |
43 #include "net/base/net_util.h" | 47 #include "net/base/net_util.h" |
44 #include "third_party/skia/include/core/SkBitmap.h" | 48 #include "third_party/skia/include/core/SkBitmap.h" |
45 #include "third_party/WebKit/WebKit/chromium/public/WebFindOptions.h" | 49 #include "third_party/WebKit/WebKit/chromium/public/WebFindOptions.h" |
46 #include "webkit/glue/form_data.h" | 50 #include "webkit/glue/form_data.h" |
47 #include "webkit/glue/form_field.h" | 51 #include "webkit/glue/form_field.h" |
48 | 52 |
49 #if defined(OS_WIN) | 53 #if defined(OS_WIN) |
50 // TODO(port): accessibility not yet implemented. See http://crbug.com/8288. | 54 // TODO(port): accessibility not yet implemented. See http://crbug.com/8288. |
51 #include "chrome/browser/browser_accessibility_manager.h" | 55 #include "chrome/browser/browser_accessibility_manager.h" |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 IPC_MESSAGE_HANDLER(ViewHostMsg_DOMUISend, | 753 IPC_MESSAGE_HANDLER(ViewHostMsg_DOMUISend, |
750 OnMsgDOMUISend) | 754 OnMsgDOMUISend) |
751 IPC_MESSAGE_HANDLER(ViewHostMsg_ForwardMessageToExternalHost, | 755 IPC_MESSAGE_HANDLER(ViewHostMsg_ForwardMessageToExternalHost, |
752 OnMsgForwardMessageToExternalHost) | 756 OnMsgForwardMessageToExternalHost) |
753 IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentLoadedInFrame, | 757 IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentLoadedInFrame, |
754 OnMsgDocumentLoadedInFrame) | 758 OnMsgDocumentLoadedInFrame) |
755 IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, | 759 IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, |
756 OnMsgGoToEntryAtOffset) | 760 OnMsgGoToEntryAtOffset) |
757 IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText) | 761 IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText) |
758 IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnMsgRunFileChooser) | 762 IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnMsgRunFileChooser) |
| 763 IPC_MESSAGE_HANDLER(ViewHostMsg_ChooseIconForFiles, OnMsgChooseIconForFiles) |
759 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage, | 764 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage, |
760 OnMsgRunJavaScriptMessage) | 765 OnMsgRunJavaScriptMessage) |
761 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm, | 766 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm, |
762 OnMsgRunBeforeUnloadConfirm) | 767 OnMsgRunBeforeUnloadConfirm) |
763 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ShowModalHTMLDialog, | 768 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ShowModalHTMLDialog, |
764 OnMsgShowModalHTMLDialog) | 769 OnMsgShowModalHTMLDialog) |
765 IPC_MESSAGE_HANDLER(ViewHostMsg_FormsSeen, OnMsgFormsSeen) | 770 IPC_MESSAGE_HANDLER(ViewHostMsg_FormsSeen, OnMsgFormsSeen) |
766 IPC_MESSAGE_HANDLER(ViewHostMsg_PasswordFormsFound, OnMsgPasswordFormsFound) | 771 IPC_MESSAGE_HANDLER(ViewHostMsg_PasswordFormsFound, OnMsgPasswordFormsFound) |
767 IPC_MESSAGE_HANDLER(ViewHostMsg_PasswordFormsVisible, | 772 IPC_MESSAGE_HANDLER(ViewHostMsg_PasswordFormsVisible, |
768 OnMsgPasswordFormsVisible) | 773 OnMsgPasswordFormsVisible) |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1308 void RenderViewHost::OnMsgSelectionChanged(const std::string& text) { | 1313 void RenderViewHost::OnMsgSelectionChanged(const std::string& text) { |
1309 if (view()) | 1314 if (view()) |
1310 view()->SelectionChanged(text); | 1315 view()->SelectionChanged(text); |
1311 } | 1316 } |
1312 | 1317 |
1313 void RenderViewHost::OnMsgRunFileChooser( | 1318 void RenderViewHost::OnMsgRunFileChooser( |
1314 const ViewHostMsg_RunFileChooser_Params& params) { | 1319 const ViewHostMsg_RunFileChooser_Params& params) { |
1315 delegate_->RunFileChooser(params); | 1320 delegate_->RunFileChooser(params); |
1316 } | 1321 } |
1317 | 1322 |
| 1323 // Manages cancelable icon loading. |
| 1324 class IconRequestProvider : public CancelableRequestProvider { |
| 1325 public: |
| 1326 typedef Callback2<int, SkBitmap*>::Type RequestCallbackType; |
| 1327 typedef CancelableRequest<RequestCallbackType> RequestType; |
| 1328 |
| 1329 Handle Start(int request_id, const std::vector<FilePath>& filenames, |
| 1330 CancelableRequestConsumerBase* consumer, |
| 1331 RequestCallbackType* callback); |
| 1332 |
| 1333 private: |
| 1334 CancelableRequestConsumerT<int, 0> consumer_; |
| 1335 }; |
| 1336 |
| 1337 // Helper for OnMsgChooseIconForFiles(). |
| 1338 // This instance runs in the UI thread. |
| 1339 class IconRequestBackend : public |
| 1340 base::RefCountedThreadSafe<IconRequestBackend> { |
| 1341 public: |
| 1342 explicit IconRequestBackend( |
| 1343 scoped_refptr<IconRequestProvider::RequestType> request, |
| 1344 CancelableRequestConsumerBase* consumer, |
| 1345 int request_id, |
| 1346 const std::vector<FilePath>& filenames) |
| 1347 : request_(request), |
| 1348 consumer_(consumer), |
| 1349 request_id_(request_id), |
| 1350 filenames_(filenames) { } |
| 1351 |
| 1352 void Run() { |
| 1353 if (request_->canceled()) { |
| 1354 Release(); |
| 1355 return; |
| 1356 } |
| 1357 |
| 1358 IconManager* im = g_browser_process->icon_manager(); |
| 1359 if (filenames_.size() <= 0) { |
| 1360 Reply(NULL); |
| 1361 } else { |
| 1362 // TODO(tkent): Load an icon representing `multiple files' in a case of |
| 1363 // filenames_.size() > 1. |
| 1364 SkBitmap* icon = im->LookupIcon(filenames_[0], IconLoader::NORMAL); |
| 1365 if (icon) { |
| 1366 Reply(icon); |
| 1367 return; |
| 1368 } |
| 1369 im->LoadIcon(filenames_[0], IconLoader::NORMAL, consumer_, |
| 1370 NewCallback(this, &IconRequestBackend::OnIconLoaded)); |
| 1371 } |
| 1372 } |
| 1373 |
| 1374 private: |
| 1375 ~IconRequestBackend() { } |
| 1376 |
| 1377 void Reply(SkBitmap* icon) { |
| 1378 request_->ForwardResult(Tuple2<int, SkBitmap*>(request_id_, icon)); |
| 1379 Release(); |
| 1380 } |
| 1381 |
| 1382 void OnIconLoaded(IconManager::Handle handle, SkBitmap* icon) { |
| 1383 Reply(icon); |
| 1384 } |
| 1385 |
| 1386 scoped_refptr<IconRequestProvider::RequestType> request_; |
| 1387 // CancelableRequestConsumer for IconManager. |
| 1388 CancelableRequestConsumerBase* consumer_; |
| 1389 // Copy of a ViewHostMsg_IconForFiles arguemnt. |
| 1390 int request_id_; |
| 1391 // Copy of a ViewHostMsg_IconForFiles arguemnt. |
| 1392 const std::vector<FilePath> filenames_; |
| 1393 |
| 1394 friend class base::RefCountedThreadSafe<IconRequestBackend>; |
| 1395 }; |
| 1396 |
| 1397 IconRequestProvider::Handle IconRequestProvider::Start( |
| 1398 int request_id, |
| 1399 const std::vector<FilePath>& filenames, |
| 1400 CancelableRequestConsumerBase* consumer, |
| 1401 RequestCallbackType* callback) { |
| 1402 scoped_refptr<RequestType> request(new RequestType(callback)); |
| 1403 AddRequest(request, consumer); |
| 1404 |
| 1405 IconRequestBackend* backend = |
| 1406 new IconRequestBackend(request, &consumer_, request_id, filenames); |
| 1407 backend->AddRef(); |
| 1408 // We need to switch to the UI thread because IconManager works |
| 1409 // only in the UI thread. |
| 1410 ChromeThread::PostTask(ChromeThread::UI, FROM_HERE, |
| 1411 NewRunnableMethod(backend, &IconRequestBackend::Run)); |
| 1412 return request->handle(); |
| 1413 } |
| 1414 |
| 1415 void RenderViewHost::OnIconLoaded(int request_id, SkBitmap* icon) { |
| 1416 std::vector<unsigned char> png_data; |
| 1417 gfx::PNGCodec::EncodeBGRASkBitmap(*icon, false, &png_data); |
| 1418 Send(new ViewMsg_ChooseIconForFilesResponse( |
| 1419 routing_id(), request_id, png_data)); |
| 1420 // No need to delete |icon|. It is owned by IconManager. |
| 1421 } |
| 1422 |
| 1423 void RenderViewHost::OnMsgChooseIconForFiles( |
| 1424 int request_id, const std::vector<FilePath>& filenames) { |
| 1425 if (icon_request_provider_.get() == NULL) { |
| 1426 icon_request_provider_.reset(new IconRequestProvider()); |
| 1427 } |
| 1428 icon_request_provider_->Start(request_id, filenames, &cancelable_consumer_, |
| 1429 NewCallback(this, &RenderViewHost::OnIconLoaded)); |
| 1430 } |
| 1431 |
1318 void RenderViewHost::OnMsgRunJavaScriptMessage( | 1432 void RenderViewHost::OnMsgRunJavaScriptMessage( |
1319 const std::wstring& message, | 1433 const std::wstring& message, |
1320 const std::wstring& default_prompt, | 1434 const std::wstring& default_prompt, |
1321 const GURL& frame_url, | 1435 const GURL& frame_url, |
1322 const int flags, | 1436 const int flags, |
1323 IPC::Message* reply_msg) { | 1437 IPC::Message* reply_msg) { |
1324 // While a JS message dialog is showing, tabs in the same process shouldn't | 1438 // While a JS message dialog is showing, tabs in the same process shouldn't |
1325 // process input events. | 1439 // process input events. |
1326 process()->set_ignore_input_events(true); | 1440 process()->set_ignore_input_events(true); |
1327 StopHangMonitorTimeout(); | 1441 StopHangMonitorTimeout(); |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1870 integration_delegate->OnPageTranslated(page_id, original_lang, | 1984 integration_delegate->OnPageTranslated(page_id, original_lang, |
1871 translated_lang, error_type); | 1985 translated_lang, error_type); |
1872 } | 1986 } |
1873 | 1987 |
1874 void RenderViewHost::OnContentBlocked(ContentSettingsType type) { | 1988 void RenderViewHost::OnContentBlocked(ContentSettingsType type) { |
1875 RenderViewHostDelegate::Resource* resource_delegate = | 1989 RenderViewHostDelegate::Resource* resource_delegate = |
1876 delegate_->GetResourceDelegate(); | 1990 delegate_->GetResourceDelegate(); |
1877 if (resource_delegate) | 1991 if (resource_delegate) |
1878 resource_delegate->OnContentBlocked(type); | 1992 resource_delegate->OnContentBlocked(type); |
1879 } | 1993 } |
OLD | NEW |