int DocumentHost::SetFocusedFrameByName(const std::string& frame_name) { LOG(TRACE) << "Entering DocumentHost::SetFocusedFrameByName"; CComPtr<IHTMLDocument2> doc; this->GetDocument(&doc); CComQIPtr<IHTMLFramesCollection2> frames; HRESULT hr = doc->get_frames(&frames); if (frames == NULL) { LOG(WARN) << "No frames in document are set, IHTMLDocument2::get_frames returned NULL"; return ENOSUCHFRAME; } long length = 0; frames->get_length(&length); if (!length) { LOG(WARN) << "No frames in document are found IHTMLFramesCollection2::get_length returned 0"; return ENOSUCHFRAME; } CComVariant name; CComBSTR name_bstr(CA2W(frame_name.c_str(), CP_UTF8)); hr = name_bstr.CopyTo(&name); // Find the frame CComVariant frame_holder; hr = frames->item(&name, &frame_holder); if (FAILED(hr)) { LOGHR(WARN, hr) << "Error retrieving frame holder, call to IHTMLFramesCollection2::item failed"; return ENOSUCHFRAME; } CComQIPtr<IHTMLWindow2> interim_result = frame_holder.pdispVal; if (!interim_result) { LOG(WARN) << "Error retrieving frame, IDispatch cannot be cast to IHTMLWindow2"; return ENOSUCHFRAME; } this->focused_frame_window_ = interim_result; return SUCCESS; }
int BrowserWrapper::SetFocusedFrameByName(const std::wstring& frame_name) { CComPtr<IHTMLDocument2> doc; this->GetDocument(&doc); CComQIPtr<IHTMLFramesCollection2> frames; HRESULT hr = doc->get_frames(&frames); if (frames == NULL) { // No frames in document. Exit. return ENOSUCHFRAME; } long length = 0; frames->get_length(&length); if (!length) { // No frames in document. Exit. return ENOSUCHFRAME; } CComVariant name; CComBSTR name_bstr(frame_name.c_str()); name_bstr.CopyTo(&name); // Find the frame CComVariant frame_holder; hr = frames->item(&name, &frame_holder); if (FAILED(hr)) { // Error retrieving frame. Exit. return ENOSUCHFRAME; } CComQIPtr<IHTMLWindow2> interim_result = frame_holder.pdispVal; if (!interim_result) { // Error retrieving frame. Exit. return ENOSUCHFRAME; } this->focused_frame_window_ = interim_result; return SUCCESS; }