static wstring dumpFramesAsText(IWebFrame* frame) { if (!frame) return L""; COMPtr<IDOMDocument> document; if (FAILED(frame->DOMDocument(&document))) return L""; COMPtr<IDOMElement> documentElement; if (FAILED(document->documentElement(&documentElement))) return L""; wstring result; // Add header for all but the main frame. COMPtr<IWebFrame> parent; if (FAILED(frame->parentFrame(&parent))) return L""; if (parent) { BSTR name = L""; if (FAILED(frame->name(&name))) return L""; result.append(L"\n--------\nFrame: '"); result.append(name ? name : L"", SysStringLen(name)); result.append(L"'\n--------\n"); SysFreeString(name); } BSTR innerText = 0; COMPtr<IDOMElementPrivate> docPrivate; if (SUCCEEDED(documentElement->QueryInterface(&docPrivate))) docPrivate->innerText(&innerText); result.append(innerText ? innerText : L"", SysStringLen(innerText)); result.append(L"\n"); SysFreeString(innerText); if (::gLayoutTestController->dumpChildFramesAsText()) { COMPtr<IEnumVARIANT> enumKids; if (FAILED(frame->childFrames(&enumKids))) return L""; VARIANT var; VariantInit(&var); while (enumKids->Next(1, &var, 0) == S_OK) { ASSERT(V_VT(&var) == VT_UNKNOWN); COMPtr<IWebFrame> framePtr; V_UNKNOWN(&var)->QueryInterface(IID_IWebFrame, (void**)&framePtr); result.append(dumpFramesAsText(framePtr.get())); VariantClear(&var); } } return result; }