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;
}