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

Side by Side Diff: chrome/utility/sandboxed_shell_handler_win.cc

Issue 431343002: Experimentally isolate OpenItemViaShell in a utility process. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add a comment. Created 6 years, 4 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
« no previous file with comments | « chrome/common/chrome_utility_messages.h ('k') | chrome/utility/shell_handler_win.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2014 The Chromium Authors. All rights reserved.
jochen (gone - plz use gerrit) 2014/08/04 09:13:41 why this file? Where's the header and the gyp/gn c
erikwright (departed) 2014/08/12 18:34:31 Sorry, this was somehow left over from an earlier
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/utility/sandboxed_shell_handler_win.h"
6
7 #include <commdlg.h>
8
9 #include "base/files/file_path.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "chrome/common/chrome_utility_messages.h"
12 #include "content/public/utility/utility_thread.h"
13 #include "ui/base/win/shell.h"
14
15 SandboxedShellHandler::SandboxedShellHandler() {}
16 SandboxedShellHandler::~SandboxedShellHandler() {}
17
18 bool SandboxedShellHandler::OnMessageReceived(const IPC::Message& message) {
19 bool handled = true;
20 IPC_BEGIN_MESSAGE_MAP(SandboxedShellHandler, message)
21 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_OpenItemViaShell,
22 OnOpenItemViaShell)
23 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetOpenFileName,
24 OnGetOpenFileName)
25 IPC_MESSAGE_UNHANDLED(handled = false)
26 IPC_END_MESSAGE_MAP()
27 return handled;
28 }
29
30 void SandboxedShellHandler::OnOpenItemViaShell(
31 const base::FilePath& full_path) {
32 ui::win::OpenItemViaShell(full_path);
33 }
34
35 void SandboxedShellHandler::OnGetOpenFileName(
36 HWND owner,
37 DWORD flags,
38 const GetOpenFileNameFilter& filter,
39 const base::FilePath& initial_directory,
40 const base::FilePath& filename) {
41 OPENFILENAME ofn;
42 // We must do this otherwise the ofn's FlagsEx may be initialized to random
43 // junk in release builds which can cause the Places Bar not to show up!
44 ZeroMemory(&ofn, sizeof(ofn));
45 ofn.lStructSize = sizeof(ofn);
46 ofn.hwndOwner = owner;
47 scoped_ptr<wchar_t[]> filename_buffer(new wchar_t[UNICODE_STRING_MAX_CHARS]);
48 // According to http://support.microsoft.com/?scid=kb;en-us;222003&x=8&y=12,
49 // The lpstrFile Buffer MUST be NULL Terminated.
50 filename_buffer[0] = 0;
51 if (!initial_directory.empty()) {
52 ofn.lpstrInitialDir = initial_directory.value().c_str();
53 if (!filename.empty()) {
54 base::wcslcpy(filename_buffer.get(),
55 filename.value().c_str(),
56 UNICODE_STRING_MAX_CHARS);
57 }
58 }
59 ofn.lpstrFile = filename_buffer.get();
60 ofn.nMaxFile = UNICODE_STRING_MAX_CHARS;
61 ofn.Flags = flags;
62 base::string16 filter_buffer;
63 if (!filter.empty()) {
64 for (GetOpenFileNameFilter::const_iterator it = filter.begin();
65 it != filter.end();
66 ++it) {
67 filter_buffer.append(it->a);
68 filter_buffer.push_back(0);
69 filter_buffer.append(it->b);
70 filter_buffer.push_back(0);
71 }
72 filter_buffer.push_back(0);
73 ofn.lpstrFilter = filter_buffer.c_str();
74 }
75
76 base::FilePath directory;
77 std::vector<base::FilePath> filenames;
78
79 if (::GetOpenFileName(&ofn)) {
80 const wchar_t* selection = ofn.lpstrFile;
81 while (*selection) { // Empty string indicates end of list.
82 filenames.push_back(base::FilePath(selection));
83 // Skip over filename and null-terminator.
84 selection += filenames.back().value().length() + 1;
85 }
86 if (filenames.size() == 1) {
87 // When there is one file, it contains the path and filename.
88 directory = filenames[0].DirName();
89 filenames[0] = filenames[0].BaseName();
90 } else if (filenames.size() > 1) {
91 // Otherwise, the first string is the path, and the remainder are
92 // filenames.
93 directory = filenames[0];
94 filenames.erase(filenames.begin());
95 }
96 }
97
98 if (filenames.size()) {
99 content::UtilityThread::Get()->Send(
100 new ChromeUtilityHostMsg_GetOpenFileName_Result(directory, filenames));
101 } else {
102 content::UtilityThread::Get()->Send(
103 new ChromeUtilityHostMsg_GetOpenFileName_Failed());
104 }
105 }
OLDNEW
« no previous file with comments | « chrome/common/chrome_utility_messages.h ('k') | chrome/utility/shell_handler_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698