HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::documentSource( /* [retval][out] */ BSTR* source) { if (!source) return E_FAIL; *source = 0; HRESULT hr = S_OK; COMPtr<IWebDataSource> dataSource; hr = m_frame->dataSource(&dataSource); if (FAILED(hr)) return hr; COMPtr<IStream> data; hr = dataSource->data(&data); if (FAILED(hr)) return hr; STATSTG stat; hr = data->Stat(&stat, STATFLAG_NONAME); if (FAILED(hr)) return hr; if (stat.cbSize.HighPart || !stat.cbSize.LowPart) return E_FAIL; Vector<char> dataBuffer(stat.cbSize.LowPart); ULONG read; hr = data->Read(dataBuffer.data(), static_cast<ULONG>(dataBuffer.size()), &read); if (FAILED(hr)) return hr; WebCore::Frame* frame = core(m_frame); if (!frame) return E_FAIL; WebCore::Document* doc = frame->document(); if (!doc) return E_FAIL; WebCore::TextResourceDecoder* decoder = doc->decoder(); if (!decoder) return E_FAIL; *source = WebCore::BString(decoder->encoding().decode(dataBuffer.data(), dataBuffer.size())).release(); return S_OK; }