Skip to content

Commit 90216e9

Browse files
laryujimevans
authored andcommitted
Treat object tag with embedded document as frame
Signed-off-by: Jim Evans <[email protected]>
1 parent 5cce5cf commit 90216e9

File tree

1 file changed

+35
-11
lines changed

1 file changed

+35
-11
lines changed

cpp/iedriver/DocumentHost.cpp

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,42 @@ int DocumentHost::SetFocusedFrameByElement(IHTMLElement* frame_element) {
148148
return WD_SUCCESS;
149149
}
150150

151-
CComPtr<IHTMLFrameBase2> frame_base;
152-
frame_element->QueryInterface<IHTMLFrameBase2>(&frame_base);
153-
if (!frame_base) {
154-
LOG(WARN) << "IHTMLElement is not a FRAME or IFRAME element";
155-
return ENOSUCHFRAME;
156-
}
157-
158151
CComPtr<IHTMLWindow2> interim_result;
159-
hr = frame_base->get_contentWindow(&interim_result);
160-
if (FAILED(hr)) {
161-
LOGHR(WARN, hr) << "Cannot get contentWindow from IHTMLFrameBase2, call to IHTMLFrameBase2::get_contentWindow failed";
162-
return ENOSUCHFRAME;
152+
CComPtr<IHTMLObjectElement4> object_element;
153+
hr = frame_element->QueryInterface<IHTMLObjectElement4>(&object_element);
154+
if (SUCCEEDED(hr) && object_element) {
155+
CComPtr<IDispatch> object_disp;
156+
object_element->get_contentDocument(&object_disp);
157+
if (!object_disp) {
158+
LOG(WARN) << "Cannot get IDispatch interface from IHTMLObjectElement4 element";
159+
return ENOSUCHFRAME;
160+
}
161+
162+
CComPtr<IHTMLDocument2> object_doc;
163+
object_disp->QueryInterface<IHTMLDocument2>(&object_doc);
164+
if (!object_doc) {
165+
LOG(WARN) << "Cannot get IHTMLDocument2 document from IDispatch reference";
166+
return ENOSUCHFRAME;
167+
}
168+
169+
hr = object_doc->get_parentWindow(&interim_result);
170+
if (FAILED(hr)) {
171+
LOGHR(WARN, hr) << "Cannot get parentWindow from IHTMLDocument2, call to IHTMLDocument2::get_parentWindow failed";
172+
return ENOSUCHFRAME;
173+
}
174+
} else {
175+
CComPtr<IHTMLFrameBase2> frame_base;
176+
frame_element->QueryInterface<IHTMLFrameBase2>(&frame_base);
177+
if (!frame_base) {
178+
LOG(WARN) << "IHTMLElement is not a FRAME or IFRAME element";
179+
return ENOSUCHFRAME;
180+
}
181+
182+
hr = frame_base->get_contentWindow(&interim_result);
183+
if (FAILED(hr)) {
184+
LOGHR(WARN, hr) << "Cannot get contentWindow from IHTMLFrameBase2, call to IHTMLFrameBase2::get_contentWindow failed";
185+
return ENOSUCHFRAME;
186+
}
163187
}
164188

165189
this->focused_frame_window_ = interim_result;

0 commit comments

Comments
 (0)