@@ -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