void GetPathToBinary(FilePath& exePath) { #if defined(OS_WIN) exePath = FilePath::FromWStringHack(CommandLine::ForCurrentProcess()->program()); exePath = exePath.DirName(); exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME); #elif defined(OS_POSIX) if (ShouldHaveDirectoryService()) { nsCOMPtr<nsIProperties> directoryService(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID)); NS_ASSERTION(directoryService, "Expected XPCOM to be available"); if (directoryService) { nsCOMPtr<nsIFile> greDir; nsresult rv = directoryService->Get(NS_GRE_DIR, NS_GET_IID(nsIFile), getter_AddRefs(greDir)); if (NS_SUCCEEDED(rv)) { nsCString path; greDir->GetNativePath(path); exePath = FilePath(path.get()); #ifdef MOZ_WIDGET_COCOA // We need to use an App Bundle on OS X so that we can hide // the dock icon. See Bug 557225. exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_BUNDLE); #endif } } } if (exePath.empty()) { exePath = FilePath(CommandLine::ForCurrentProcess()->argv()[0]); exePath = exePath.DirName(); } exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME); #endif }
//static void GeckoChildProcessHost::GetPathToBinary(FilePath& exePath) { if (ShouldHaveDirectoryService()) { MOZ_ASSERT(gGREPath); #ifdef OS_WIN exePath = FilePath(char16ptr_t(gGREPath)); #else nsCString path; NS_CopyUnicodeToNative(nsDependentString(gGREPath), path); exePath = FilePath(path.get()); #endif #ifdef MOZ_WIDGET_COCOA // We need to use an App Bundle on OS X so that we can hide // the dock icon. See Bug 557225. exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_BUNDLE); #endif } if (exePath.empty()) { #ifdef OS_WIN exePath = FilePath::FromWStringHack(CommandLine::ForCurrentProcess()->program()); #else exePath = FilePath(CommandLine::ForCurrentProcess()->argv()[0]); #endif exePath = exePath.DirName(); } exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME); }
//static void GeckoChildProcessHost::GetPathToBinary(FilePath& exePath) { if (ShouldHaveDirectoryService()) { MOZ_ASSERT(gGREBinPath); #ifdef OS_WIN exePath = FilePath(char16ptr_t(gGREBinPath)); #elif MOZ_WIDGET_COCOA nsCOMPtr<nsIFile> childProcPath; NS_NewLocalFile(nsDependentString(gGREBinPath), false, getter_AddRefs(childProcPath)); // We need to use an App Bundle on OS X so that we can hide // the dock icon. See Bug 557225. childProcPath->AppendNative(NS_LITERAL_CSTRING("plugin-container.app")); childProcPath->AppendNative(NS_LITERAL_CSTRING("Contents")); childProcPath->AppendNative(NS_LITERAL_CSTRING("MacOS")); nsCString tempCPath; childProcPath->GetNativePath(tempCPath); exePath = FilePath(tempCPath.get()); #else nsCString path; NS_CopyUnicodeToNative(nsDependentString(gGREBinPath), path); exePath = FilePath(path.get()); #endif } if (exePath.empty()) { #ifdef OS_WIN exePath = FilePath::FromWStringHack(CommandLine::ForCurrentProcess()->program()); #else exePath = FilePath(CommandLine::ForCurrentProcess()->argv()[0]); #endif exePath = exePath.DirName(); } #ifdef MOZ_WIDGET_ANDROID exePath = exePath.AppendASCII("lib"); // We must use the PIE binary on 5.0 and higher const char* processName = mozilla::AndroidBridge::Bridge()->GetAPIVersion() >= 21 ? MOZ_CHILD_PROCESS_NAME_PIE : MOZ_CHILD_PROCESS_NAME; exePath = exePath.AppendASCII(processName); #else exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME); #endif }
// Open an item via a shell execute command. Error code checking and casting // explanation: http://msdn2.microsoft.com/en-us/library/ms647732.aspx bool OpenItemViaShell(const FilePath& full_path) { HINSTANCE h = ::ShellExecuteW( NULL, NULL, full_path.value().c_str(), NULL, full_path.DirName().value().c_str(), SW_SHOWNORMAL); LONG_PTR error = reinterpret_cast<LONG_PTR>(h); if(error > 32) { return true; } if((error == SE_ERR_NOASSOC)) { return OpenItemWithExternalApp(full_path.value()); } return false; }
//static void GeckoChildProcessHost::GetPathToBinary(FilePath& exePath, GeckoProcessType processType) { if (sRunSelfAsContentProc && processType == GeckoProcessType_Content) { #if defined(OS_WIN) wchar_t exePathBuf[MAXPATHLEN]; if (!::GetModuleFileNameW(nullptr, exePathBuf, MAXPATHLEN)) { MOZ_CRASH("GetModuleFileNameW failed (FIXME)"); } exePath = FilePath::FromWStringHack(exePathBuf); #elif defined(OS_POSIX) exePath = FilePath(CommandLine::ForCurrentProcess()->argv()[0]); #else # error Sorry; target OS not supported yet. #endif return; } if (ShouldHaveDirectoryService()) { MOZ_ASSERT(gGREBinPath); #ifdef OS_WIN exePath = FilePath(char16ptr_t(gGREBinPath)); #elif MOZ_WIDGET_COCOA nsCOMPtr<nsIFile> childProcPath; NS_NewLocalFile(nsDependentString(gGREBinPath), false, getter_AddRefs(childProcPath)); // We need to use an App Bundle on OS X so that we can hide // the dock icon. See Bug 557225. childProcPath->AppendNative(NS_LITERAL_CSTRING("plugin-container.app")); childProcPath->AppendNative(NS_LITERAL_CSTRING("Contents")); childProcPath->AppendNative(NS_LITERAL_CSTRING("MacOS")); nsCString tempCPath; childProcPath->GetNativePath(tempCPath); exePath = FilePath(tempCPath.get()); #else nsCString path; NS_CopyUnicodeToNative(nsDependentString(gGREBinPath), path); exePath = FilePath(path.get()); #endif } if (exePath.empty()) { #ifdef OS_WIN exePath = FilePath::FromWStringHack(CommandLine::ForCurrentProcess()->program()); #else exePath = FilePath(CommandLine::ForCurrentProcess()->argv()[0]); #endif exePath = exePath.DirName(); } #ifdef MOZ_WIDGET_ANDROID exePath = exePath.AppendASCII("lib"); // We must use the PIE binary on 5.0 and higher const char* processName = mozilla::AndroidBridge::Bridge()->GetAPIVersion() >= 21 ? MOZ_CHILD_PROCESS_NAME_PIE : MOZ_CHILD_PROCESS_NAME; exePath = exePath.AppendASCII(processName); #else exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME); #endif }
bool GeckoChildProcessHost::PerformAsyncLaunch(std::vector<std::string> aExtraOpts) { // FIXME/cjones: make this work from non-IO threads, too // We rely on the fact that InitializeChannel() has already been processed // on the IO thread before this point is reached. if (!GetChannel()) { return false; } base::ProcessHandle process; // send the child the PID so that it can open a ProcessHandle back to us. // probably don't want to do this in the long run char pidstring[32]; PR_snprintf(pidstring, sizeof(pidstring) - 1, "%ld", base::Process::Current().pid()); const char* const childProcessType = XRE_ChildProcessTypeToString(mProcessType); //-------------------------------------------------- #if defined(OS_POSIX) // For POSIX, we have to be extremely anal about *not* using // std::wstring in code compiled with Mozilla's -fshort-wchar // configuration, because chromium is compiled with -fno-short-wchar // and passing wstrings from one config to the other is unsafe. So // we split the logic here. FilePath exePath; #ifdef OS_LINUX base::environment_map newEnvVars; #endif nsCOMPtr<nsIProperties> directoryService(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID)); nsCOMPtr<nsIFile> greDir; nsresult rv = directoryService->Get(NS_GRE_DIR, NS_GET_IID(nsIFile), getter_AddRefs(greDir)); if (NS_SUCCEEDED(rv)) { nsCString path; greDir->GetNativePath(path); exePath = FilePath(path.get()); #ifdef OS_LINUX newEnvVars["LD_LIBRARY_PATH"] = path.get(); #endif } else { exePath = FilePath(CommandLine::ForCurrentProcess()->argv()[0]); exePath = exePath.DirName(); } exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME); // remap the IPC socket fd to a well-known int, as the OS does for // STDOUT_FILENO, for example int srcChannelFd, dstChannelFd; channel().GetClientFileDescriptorMapping(&srcChannelFd, &dstChannelFd); mFileMap.push_back(std::pair<int,int>(srcChannelFd, dstChannelFd)); // no need for kProcessChannelID, the child process inherits the // other end of the socketpair() from us std::vector<std::string> childArgv; childArgv.push_back(exePath.value()); childArgv.insert(childArgv.end(), aExtraOpts.begin(), aExtraOpts.end()); childArgv.push_back(pidstring); childArgv.push_back(childProcessType); #if defined(MOZ_CRASHREPORTER) int childCrashFd, childCrashRemapFd; if (!CrashReporter::CreateNotificationPipeForChild( &childCrashFd, &childCrashRemapFd)) return false; if (0 <= childCrashFd) { mFileMap.push_back(std::pair<int,int>(childCrashFd, childCrashRemapFd)); // "true" == crash reporting enabled childArgv.push_back("true"); } else { // "false" == crash reporting disabled childArgv.push_back("false"); } #endif base::LaunchApp(childArgv, mFileMap, #ifdef OS_LINUX newEnvVars, #endif false, &process); //-------------------------------------------------- #elif defined(OS_WIN) FilePath exePath = FilePath::FromWStringHack(CommandLine::ForCurrentProcess()->program()); exePath = exePath.DirName(); exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME); CommandLine cmdLine(exePath.ToWStringHack()); cmdLine.AppendSwitchWithValue(switches::kProcessChannelID, channel_id()); for (std::vector<std::string>::iterator it = aExtraOpts.begin(); it != aExtraOpts.end(); ++it) { cmdLine.AppendLooseValue(UTF8ToWide(*it)); } cmdLine.AppendLooseValue(UTF8ToWide(pidstring)); cmdLine.AppendLooseValue(UTF8ToWide(childProcessType)); #if defined(MOZ_CRASHREPORTER) cmdLine.AppendLooseValue( UTF8ToWide(CrashReporter::GetChildNotificationPipe())); #endif base::LaunchApp(cmdLine, false, false, &process); #else # error Sorry #endif if (!process) { return false; } SetHandle(process); return true; }