OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 // Implementation for the asynchronous interface to the Windows shell | 5 // Implementation for the asynchronous interface to the Windows shell |
6 // SHOpenWithDialog function. The call is made on a dedicated UI thread in a | 6 // SHOpenWithDialog function. The call is made on a dedicated UI thread in a |
7 // single-threaded apartment. | 7 // single-threaded apartment. |
8 | 8 |
9 #include "win8/test/open_with_dialog_async.h" | 9 #include "win8/test/open_with_dialog_async.h" |
10 | 10 |
11 #include <shlobj.h> | 11 #include <shlobj.h> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/callback.h" | 14 #include "base/callback.h" |
15 #include "base/location.h" | 15 #include "base/location.h" |
16 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
17 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
18 #include "base/thread_task_runner_handle.h" | 18 #include "base/thread_task_runner_handle.h" |
19 #include "base/threading/platform_thread.h" | 19 #include "base/threading/platform_thread.h" |
20 #include "base/threading/thread.h" | 20 #include "base/threading/thread.h" |
21 #include "base/win/windows_version.h" | 21 #include "base/win/windows_version.h" |
22 | 22 |
23 namespace win8 { | 23 namespace win8 { |
24 | 24 |
25 namespace { | 25 namespace { |
26 | 26 |
27 struct OpenWithContext { | 27 struct OpenWithContext { |
28 OpenWithContext( | 28 OpenWithContext( |
29 HWND parent_window_in, | 29 HWND parent_window_in, |
30 const string16& file_name_in, | 30 const base::string16& file_name_in, |
31 const string16& file_type_class_in, | 31 const base::string16& file_type_class_in, |
32 int open_as_info_flags_in, | 32 int open_as_info_flags_in, |
33 const scoped_refptr<base::SingleThreadTaskRunner>& client_runner_in, | 33 const scoped_refptr<base::SingleThreadTaskRunner>& client_runner_in, |
34 const OpenWithDialogCallback& callback_in); | 34 const OpenWithDialogCallback& callback_in); |
35 ~OpenWithContext(); | 35 ~OpenWithContext(); |
36 | 36 |
37 base::Thread thread; | 37 base::Thread thread; |
38 HWND parent_window; | 38 HWND parent_window; |
39 string16 file_name; | 39 base::string16 file_name; |
40 string16 file_type_class; | 40 base::string16 file_type_class; |
41 int open_as_info_flags; | 41 int open_as_info_flags; |
42 scoped_refptr<base::SingleThreadTaskRunner> client_runner; | 42 scoped_refptr<base::SingleThreadTaskRunner> client_runner; |
43 OpenWithDialogCallback callback; | 43 OpenWithDialogCallback callback; |
44 }; | 44 }; |
45 | 45 |
46 OpenWithContext::OpenWithContext( | 46 OpenWithContext::OpenWithContext( |
47 HWND parent_window_in, | 47 HWND parent_window_in, |
48 const string16& file_name_in, | 48 const base::string16& file_name_in, |
49 const string16& file_type_class_in, | 49 const base::string16& file_type_class_in, |
50 int open_as_info_flags_in, | 50 int open_as_info_flags_in, |
51 const scoped_refptr<base::SingleThreadTaskRunner>& client_runner_in, | 51 const scoped_refptr<base::SingleThreadTaskRunner>& client_runner_in, |
52 const OpenWithDialogCallback& callback_in) | 52 const OpenWithDialogCallback& callback_in) |
53 : thread("OpenWithDialog"), | 53 : thread("OpenWithDialog"), |
54 parent_window(parent_window_in), | 54 parent_window(parent_window_in), |
55 file_name(file_name_in), | 55 file_name(file_name_in), |
56 file_type_class(file_type_class_in), | 56 file_type_class(file_type_class_in), |
57 open_as_info_flags(open_as_info_flags_in), | 57 open_as_info_flags(open_as_info_flags_in), |
58 client_runner(client_runner_in), | 58 client_runner(client_runner_in), |
59 callback(callback_in) { | 59 callback(callback_in) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 // In practice this is only likely to happen at shutdown, so there isn't | 97 // In practice this is only likely to happen at shutdown, so there isn't |
98 // much of a concern that it'll happen in the real world. | 98 // much of a concern that it'll happen in the real world. |
99 DLOG(ERROR) << "leaking OpenWith thread; result = " << std::hex << result; | 99 DLOG(ERROR) << "leaking OpenWith thread; result = " << std::hex << result; |
100 } | 100 } |
101 } | 101 } |
102 | 102 |
103 } // namespace | 103 } // namespace |
104 | 104 |
105 void OpenWithDialogAsync( | 105 void OpenWithDialogAsync( |
106 HWND parent_window, | 106 HWND parent_window, |
107 const string16& file_name, | 107 const base::string16& file_name, |
108 const string16& file_type_class, | 108 const base::string16& file_type_class, |
109 int open_as_info_flags, | 109 int open_as_info_flags, |
110 const OpenWithDialogCallback& callback) { | 110 const OpenWithDialogCallback& callback) { |
111 DCHECK_GE(base::win::GetVersion(), base::win::VERSION_VISTA); | 111 DCHECK_GE(base::win::GetVersion(), base::win::VERSION_VISTA); |
112 OpenWithContext* context = | 112 OpenWithContext* context = |
113 new OpenWithContext(parent_window, file_name, file_type_class, | 113 new OpenWithContext(parent_window, file_name, file_type_class, |
114 open_as_info_flags, | 114 open_as_info_flags, |
115 base::ThreadTaskRunnerHandle::Get(), callback); | 115 base::ThreadTaskRunnerHandle::Get(), callback); |
116 context->thread.message_loop()->PostTask( | 116 context->thread.message_loop()->PostTask( |
117 FROM_HERE, | 117 FROM_HERE, |
118 base::Bind(&OpenWithDialogTask, context)); | 118 base::Bind(&OpenWithDialogTask, context)); |
119 } | 119 } |
120 | 120 |
121 } // namespace win8 | 121 } // namespace win8 |
OLD | NEW |