@@ -296,34 +296,36 @@ LRESULT IECommandExecutor::OnAfterNewWindow(UINT uMsg,
296
296
HWND top_level_handle = browser_wrapper->GetTopLevelWindowHandle ();
297
297
298
298
std::vector<HWND>* current_window_handles =
299
- reinterpret_cast <std::vector<HWND>*>(lParam);
299
+ reinterpret_cast <std::vector<HWND>*>(lParam);
300
300
std::unordered_set<HWND> current_window_set (
301
- current_window_handles->begin (),
302
- current_window_handles->end ());
301
+ current_window_handles->begin (),
302
+ current_window_handles->end ());
303
303
delete current_window_handles;
304
304
305
305
// sleep 0.5s then get current window handles
306
306
::Sleep (500 );
307
307
308
308
std::vector<HWND> edge_window_handles;
309
309
::EnumWindows (&BrowserFactory::FindEdgeBrowserHandles,
310
- reinterpret_cast <LPARAM>(&edge_window_handles));
310
+ reinterpret_cast <LPARAM>(&edge_window_handles));
311
311
312
312
std::vector<HWND> new_ie_window_handles;
313
- for (auto & ewh : edge_window_handles) {
313
+ for (auto & edge_window_handle : edge_window_handles) {
314
314
std::vector<HWND> child_window_handles;
315
- ::EnumChildWindows (ewh, &BrowserFactory::FindIEBrowserHandles,
316
- reinterpret_cast <LPARAM>(&child_window_handles));
315
+ ::EnumChildWindows (edge_window_handle,
316
+ &BrowserFactory::FindIEBrowserHandles,
317
+ reinterpret_cast <LPARAM>(&child_window_handles));
317
318
318
- for (auto & cwh : child_window_handles) {
319
- new_ie_window_handles.push_back (cwh );
319
+ for (auto & child_window_handle : child_window_handles) {
320
+ new_ie_window_handles.push_back (child_window_handle );
320
321
}
321
322
}
322
323
323
324
std::vector<HWND> diff;
324
325
for (auto & window_handle : new_ie_window_handles) {
325
- if (current_window_set.find (window_handle) != current_window_set.end ())
326
+ if (current_window_set.find (window_handle) != current_window_set.end ()) {
326
327
continue ;
328
+ }
327
329
diff.push_back (window_handle);
328
330
}
329
331
@@ -347,10 +349,9 @@ LRESULT IECommandExecutor::OnAfterNewWindow(UINT uMsg,
347
349
info.pBrowser = NULL ;
348
350
std::string error_message = " " ;
349
351
this ->factory_ ->AttachToBrowser (&info, &error_message);
350
- BrowserHandle new_window_wrapper (new Browser (info.pBrowser ,
351
- NULL ,
352
- this ->m_hWnd ,
353
- true ));
352
+ BrowserHandle new_window_wrapper (
353
+ new Browser (info.pBrowser , NULL , this ->m_hWnd , true ));
354
+
354
355
// Force a wait cycle to make sure the browser is finished initializing.
355
356
new_window_wrapper->Wait (NORMAL_PAGE_LOAD_STRATEGY);
356
357
this ->AddManagedBrowser (new_window_wrapper);
@@ -1273,7 +1274,7 @@ std::string IECommandExecutor::OpenNewBrowsingContext(const std::string& window_
1273
1274
}
1274
1275
1275
1276
std::string IECommandExecutor::OpenNewBrowsingContext (const std::string& window_type,
1276
- const std::string& url) {
1277
+ const std::string& url) {
1277
1278
LOG (TRACE) << " Entering IECommandExecutor::OpenNewBrowsingContext" ;
1278
1279
std::wstring target_url = StringUtilities::ToWString (url);
1279
1280
std::string new_browser_id = " " ;
@@ -1351,48 +1352,74 @@ std::string IECommandExecutor::OpenNewBrowserTab(const std::wstring& url) {
1351
1352
NULL );
1352
1353
::Sleep (500 );
1353
1354
1354
- clock_t end_time = clock () + 5 * CLOCKS_PER_SEC ;
1355
+ HWND new_tab_window = NULL ;
1355
1356
std::vector<HWND> new_handles;
1356
1357
::EnumChildWindows (top_level_handle,
1357
1358
&BrowserFactory::FindIEBrowserHandles,
1358
1359
reinterpret_cast <LPARAM>(&new_handles));
1359
- while (new_handles.size () <= original_handles.size () &&
1360
- clock () < end_time) {
1361
- ::Sleep (50 );
1362
- ::EnumChildWindows (top_level_handle,
1363
- &BrowserFactory::FindIEBrowserHandles,
1364
- reinterpret_cast <LPARAM>(&new_handles));
1365
- }
1366
- std::sort (new_handles.begin (), new_handles.end ());
1360
+ clock_t end_time = clock () + 5 * CLOCKS_PER_SEC;
1361
+ if (browser_wrapper->is_edge_chromium ()) {
1362
+ // It appears that for Chromium-based Edge in IE Mode, there will only
1363
+ // ever be one active child window of the top-level window with window
1364
+ // class "Internet Explorer_Server", which is the active tab. Inactive
1365
+ // tabs are re-parented until brought back to being the active tab.
1366
+ while ((new_handles.size () == 0 || new_handles[0 ] == original_handles[0 ])
1367
+ && clock () < end_time) {
1368
+ if (new_handles.size () != 0 ) {
1369
+ new_handles.clear ();
1370
+ }
1367
1371
1368
- if (new_handles.size () <= original_handles.size ()) {
1369
- LOG (WARN) << " No new window handle found after attempt to open" ;
1370
- return " " ;
1371
- }
1372
+ ::Sleep (50 );
1373
+ ::EnumChildWindows (top_level_handle,
1374
+ &BrowserFactory::FindIEBrowserHandles,
1375
+ reinterpret_cast <LPARAM>(&new_handles));
1376
+ }
1377
+
1378
+ if (new_handles.size () == 0 || new_handles[0 ] == original_handles[0 ]) {
1379
+ LOG (WARN) << " No new window handle found after attempt to open" ;
1380
+ return " " ;
1381
+ }
1372
1382
1373
- // We are guaranteed to have at least one HWND difference
1374
- // between the two vectors if we reach this point, because
1375
- // we know the vectors are different sizes.
1376
- std::vector<HWND> diff (new_handles.size ());
1377
- std::vector<HWND>::iterator it = std::set_difference (new_handles.begin (),
1378
- new_handles.end (),
1379
- original_handles.begin (),
1380
- original_handles.end (),
1381
- diff.begin ());
1382
- diff.resize (it - diff.begin ());
1383
- if (diff.size () > 1 ) {
1384
- std::string handle_list = " " ;
1385
- std::vector<HWND>::const_iterator it = diff.begin ();
1386
- for (; it != diff.end (); ++it) {
1387
- if (handle_list.size () > 0 ) {
1388
- handle_list.append (" , " );
1383
+ new_tab_window = new_handles[0 ];
1384
+ } else {
1385
+ while (new_handles.size () <= original_handles.size () &&
1386
+ clock () < end_time) {
1387
+ ::Sleep (50 );
1388
+ ::EnumChildWindows (top_level_handle,
1389
+ &BrowserFactory::FindIEBrowserHandles,
1390
+ reinterpret_cast <LPARAM>(&new_handles));
1391
+ }
1392
+ std::sort (new_handles.begin (), new_handles.end ());
1393
+
1394
+ if (new_handles.size () <= original_handles.size ()) {
1395
+ LOG (WARN) << " No new window handle found after attempt to open" ;
1396
+ return " " ;
1397
+ }
1398
+
1399
+ // We are guaranteed to have at least one HWND difference
1400
+ // between the two vectors if we reach this point, because
1401
+ // we know the vectors are different sizes.
1402
+ std::vector<HWND> diff (new_handles.size ());
1403
+ std::vector<HWND>::iterator it = std::set_difference (new_handles.begin (),
1404
+ new_handles.end (),
1405
+ original_handles.begin (),
1406
+ original_handles.end (),
1407
+ diff.begin ());
1408
+ diff.resize (it - diff.begin ());
1409
+ if (diff.size () > 1 ) {
1410
+ std::string handle_list = " " ;
1411
+ std::vector<HWND>::const_iterator it = diff.begin ();
1412
+ for (; it != diff.end (); ++it) {
1413
+ if (handle_list.size () > 0 ) {
1414
+ handle_list.append (" , " );
1415
+ }
1416
+ handle_list.append (StringUtilities::Format (" 0x%08x" , *it));
1389
1417
}
1390
- handle_list.append (StringUtilities::Format (" 0x%08x" , *it));
1418
+ LOG (DEBUG) << " Found more than one new window handles! Found "
1419
+ << diff.size () << " windows [" << handle_list << " ]" ;
1391
1420
}
1392
- LOG (DEBUG) << " Found more than one new window handles! Found "
1393
- << diff.size () << " windows [" << handle_list << " ]" ;
1421
+ new_tab_window = diff[0 ];
1394
1422
}
1395
- HWND new_tab_window = diff[0 ];
1396
1423
1397
1424
DWORD process_id;
1398
1425
::GetWindowThreadProcessId (new_tab_window, &process_id);
0 commit comments