@@ -335,6 +335,44 @@ void BrowserFactory::LaunchBrowserUsingCreateProcess(PROCESS_INFORMATION* proc_i
335
335
delete[] command_line;
336
336
}
337
337
338
+ bool BrowserFactory::DirectoryExists (std::wstring& dir_name) {
339
+ DWORD attribs = ::GetFileAttributes (dir_name.c_str ());
340
+ if (attribs == INVALID_FILE_ATTRIBUTES) {
341
+ return false ;
342
+ }
343
+ return (attribs & FILE_ATTRIBUTE_DIRECTORY);
344
+ }
345
+
346
+ bool BrowserFactory::CreateUniqueTempDir (std::wstring &temp_dir) {
347
+ // get temporary folder for the current user
348
+ wchar_t temp[128 ];
349
+ ::GetTempPath (128 , temp);
350
+ std::wstring wtemp = temp;
351
+ if (!DirectoryExists (wtemp)) {
352
+ return false ;
353
+ }
354
+
355
+ // create a IEDriver temporary folder inside the user level temporary folder
356
+ bool temp_dir_created = false ;
357
+ for (int i=0 ; i<10 ; i++) {
358
+ std::wstring output = wtemp + L" IEDriver-" + StringUtilities::CreateGuid ();
359
+ if (DirectoryExists (output)) {
360
+ continue ;
361
+ }
362
+
363
+ ::CreateDirectory (output.c_str(), NULL);
364
+ if (!DirectoryExists (output)) {
365
+ continue ;
366
+ }
367
+
368
+ temp_dir = output;
369
+ temp_dir_created = true ;
370
+ break ;
371
+ }
372
+
373
+ return temp_dir_created;
374
+ }
375
+
338
376
void BrowserFactory::LaunchEdgeInIEMode (PROCESS_INFORMATION* proc_info,
339
377
std::string* error_message) {
340
378
LOG (TRACE) << " Entering BrowserFactory::LaunchEdgeInIEMode" ;
@@ -353,6 +391,14 @@ void BrowserFactory::LaunchEdgeInIEMode(PROCESS_INFORMATION* proc_info,
353
391
executable_and_url.append (L" --ie-mode-force" );
354
392
executable_and_url.append (L" --internet-explorer-integration=iemode" );
355
393
394
+ // create a temporary directory for IEDriver test
395
+ std::wstring temp_dir;
396
+ if (CreateUniqueTempDir (temp_dir)) {
397
+ LOG (TRACE) << L" Using temporary folder " << LOGWSTRING (temp_dir) << " ." ;
398
+ executable_and_url.append (L" --user-data-dir=" + temp_dir);
399
+ this ->edge_user_data_dir_ = temp_dir;
400
+ }
401
+
356
402
executable_and_url.append (L" " );
357
403
executable_and_url.append (this ->initial_browser_url_ );
358
404
@@ -1393,4 +1439,55 @@ bool BrowserFactory::IsEdgeMode() const {
1393
1439
return this ->edge_ie_mode_ ;
1394
1440
}
1395
1441
1442
+ // delete a folder recursively
1443
+ int BrowserFactory::DeleteDirectory (const std::wstring &dir_name) {
1444
+ WIN32_FIND_DATA file_info;
1445
+
1446
+ std::wstring file_pattern = dir_name + L" \\ *.*" ;
1447
+ HANDLE file_handle = ::FindFirstFile (file_pattern.c_str (), &file_info);
1448
+ if (file_handle != INVALID_HANDLE_VALUE) {
1449
+ do {
1450
+ if (file_info.cFileName [0 ] == ' .' ) {
1451
+ continue ;
1452
+ }
1453
+ std::wstring file_path = dir_name + L" \\ " + file_info.cFileName ;
1454
+
1455
+ if (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
1456
+ int return_value = DeleteDirectory (file_path);
1457
+ if (return_value) {
1458
+ return return_value;
1459
+ }
1460
+ } else {
1461
+ if (::SetFileAttributes (file_path.c_str (), FILE_ATTRIBUTE_NORMAL) == FALSE ) {
1462
+ return ::GetLastError ();
1463
+ }
1464
+
1465
+ if (::DeleteFile (file_path.c_str ()) == FALSE ) {
1466
+ return ::GetLastError ();
1467
+ }
1468
+ }
1469
+ } while (::FindNextFile (file_handle, &file_info) == TRUE );
1470
+
1471
+ ::FindClose (file_handle);
1472
+ DWORD dwError = ::GetLastError ();
1473
+ if (dwError != ERROR_NO_MORE_FILES) {
1474
+ return dwError;
1475
+ }
1476
+
1477
+ if (::SetFileAttributes (dir_name.c_str (), FILE_ATTRIBUTE_NORMAL) == FALSE ) {
1478
+ return ::GetLastError ();
1479
+ }
1480
+
1481
+ if (::RemoveDirectory (dir_name.c_str ()) == FALSE ) {
1482
+ return ::GetLastError ();
1483
+ }
1484
+ }
1485
+
1486
+ return 0 ;
1487
+ }
1488
+
1489
+ std::wstring BrowserFactory::GetEdgeTempDir () {
1490
+ return this ->edge_user_data_dir_ ;
1491
+ }
1492
+
1396
1493
} // namespace webdriver
0 commit comments