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

Side by Side Diff: chrome/browser/renderer_host/render_view_host.cc

Issue 174318: Introduce new async IPC message to get file icons (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 7 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 | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/render_view_host.h ('k') | chrome/common/render_messages_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698