OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 #include "apps/app_shim/app_shim_host_mac.h" | 5 #include "apps/app_shim/app_shim_host_mac.h" |
6 | 6 |
7 #include "apps/app_shim/app_shim_handler_mac.h" | 7 #include "apps/app_shim/app_shim_handler_mac.h" |
8 #include "apps/app_shim/app_shim_messages.h" | 8 #include "apps/app_shim/app_shim_messages.h" |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 | 56 |
57 void AppShimHost::OnChannelError() { | 57 void AppShimHost::OnChannelError() { |
58 Close(); | 58 Close(); |
59 } | 59 } |
60 | 60 |
61 bool AppShimHost::Send(IPC::Message* message) { | 61 bool AppShimHost::Send(IPC::Message* message) { |
62 DCHECK(channel_.get()); | 62 DCHECK(channel_.get()); |
63 return channel_->Send(message); | 63 return channel_->Send(message); |
64 } | 64 } |
65 | 65 |
66 void AppShimHost::OnLaunchApp(std::string profile_dir, std::string app_id) { | 66 void AppShimHost::OnLaunchApp(base::FilePath profile_dir, |
| 67 std::string app_id, |
| 68 apps::AppShimLaunchType launch_type) { |
67 DCHECK(CalledOnValidThread()); | 69 DCHECK(CalledOnValidThread()); |
68 DCHECK(!profile_); | 70 DCHECK(!profile_); |
69 if (profile_) { | 71 if (profile_) { |
70 // Only one app launch message per channel. | 72 // Only one app launch message per channel. |
71 Send(new AppShimMsg_LaunchApp_Done(false)); | 73 Send(new AppShimMsg_LaunchApp_Done(false)); |
72 return; | 74 return; |
73 } | 75 } |
74 | 76 |
75 profile_ = FetchProfileForDirectory(profile_dir); | 77 if (!(profile_ = FetchProfileForDirectory(profile_dir))) { |
| 78 Send(new AppShimMsg_LaunchApp_Done(false)); |
| 79 return; |
| 80 } |
| 81 |
76 app_id_ = app_id; | 82 app_id_ = app_id; |
| 83 |
77 apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); | 84 apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); |
78 bool success = handler && handler->OnShimLaunch(this); | 85 bool success = handler && handler->OnShimLaunch(this, launch_type); |
79 Send(new AppShimMsg_LaunchApp_Done(success)); | 86 Send(new AppShimMsg_LaunchApp_Done(success)); |
80 } | 87 } |
81 | 88 |
82 void AppShimHost::OnFocus() { | 89 void AppShimHost::OnFocus() { |
83 DCHECK(CalledOnValidThread()); | 90 DCHECK(CalledOnValidThread()); |
84 apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); | 91 apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); |
85 if (handler) | 92 if (handler) |
86 handler->OnShimFocus(this); | 93 handler->OnShimFocus(this); |
87 } | 94 } |
88 | 95 |
89 void AppShimHost::OnQuit() { | 96 void AppShimHost::OnQuit() { |
90 DCHECK(CalledOnValidThread()); | 97 DCHECK(CalledOnValidThread()); |
91 apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); | 98 apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); |
92 if (handler) | 99 if (handler) |
93 handler->OnShimQuit(this); | 100 handler->OnShimQuit(this); |
94 } | 101 } |
95 | 102 |
96 Profile* AppShimHost::FetchProfileForDirectory(const std::string& profile_dir) { | 103 Profile* AppShimHost::FetchProfileForDirectory( |
| 104 const base::FilePath& profile_dir) { |
97 ProfileManager* profileManager = g_browser_process->profile_manager(); | 105 ProfileManager* profileManager = g_browser_process->profile_manager(); |
98 // Even though the name of this function is "unsafe", there's no security | 106 // Check for the profile name in the profile info cache to ensure that we |
99 // issue here -- the check for the profile name in the profile info cache | 107 // never access any directory that isn't a known profile. |
100 // ensures that we never access any directory that isn't a known profile. | 108 base::FilePath path = profileManager->user_data_dir().Append(profile_dir); |
101 base::FilePath path = base::FilePath::FromUTF8Unsafe(profile_dir); | |
102 path = profileManager->user_data_dir().Append(path); | |
103 ProfileInfoCache& cache = profileManager->GetProfileInfoCache(); | 109 ProfileInfoCache& cache = profileManager->GetProfileInfoCache(); |
104 // This ensures that the given profile path is acutally a profile that we | |
105 // already know about. | |
106 if (cache.GetIndexOfProfileWithPath(path) == std::string::npos) { | 110 if (cache.GetIndexOfProfileWithPath(path) == std::string::npos) { |
107 LOG(ERROR) << "Requested directory is not a known profile '" | 111 LOG(ERROR) << "Requested directory is not a known profile '" |
108 << profile_dir << "'."; | 112 << profile_dir.value() << "'."; |
109 return NULL; | 113 return NULL; |
110 } | 114 } |
111 Profile* profile = profileManager->GetProfile(path); | 115 Profile* profile = profileManager->GetProfile(path); |
112 if (!profile) { | 116 if (!profile) { |
113 LOG(ERROR) << "Couldn't get profile for directory '" << profile_dir << "'."; | 117 LOG(ERROR) << "Couldn't get profile for directory '" |
| 118 << profile_dir.value() << "'."; |
114 return NULL; | 119 return NULL; |
115 } | 120 } |
116 return profile; | 121 return profile; |
117 } | 122 } |
118 | 123 |
119 void AppShimHost::OnAppClosed() { | 124 void AppShimHost::OnAppClosed() { |
120 Close(); | 125 Close(); |
121 } | 126 } |
122 | 127 |
123 void AppShimHost::Close() { | 128 void AppShimHost::Close() { |
124 DCHECK(CalledOnValidThread()); | 129 DCHECK(CalledOnValidThread()); |
125 delete this; | 130 delete this; |
126 } | 131 } |
OLD | NEW |