diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index c03e5160bf8..706e8b5a8f9 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -5933,7 +5933,15 @@ static const uri_parse_test uri_parse_tests[] = { {"zip://google.com/",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE}, {"file:///c:/testing/",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE}, {"file://server/test",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE}, - {"zip:test/test",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE} + {"zip:test/test",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE}, + + /* PARSE_DOCUMENT tests. */ + {"http://test@google.com/test?query#frag",0,PARSE_DOCUMENT,0,"http://test@google.com/test?query",S_OK,FALSE}, + {"http:testing#frag",0,PARSE_DOCUMENT,0,"",S_OK,FALSE}, + {"file:///c:/test#frag",0,PARSE_DOCUMENT,0,"",S_OK,FALSE}, + {"zip://google.com/#frag",0,PARSE_DOCUMENT,0,"",S_OK,FALSE}, + {"zip:test#frag",0,PARSE_DOCUMENT,0,"",S_OK,FALSE}, + {"testing#frag",Uri_CREATE_ALLOW_RELATIVE,PARSE_DOCUMENT,0,"",S_OK,FALSE} }; static inline LPWSTR a2w(LPCSTR str) { diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index 475db7f78a3..4247c71ebf4 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -6265,6 +6265,39 @@ static HRESULT parse_rootdocument(const Uri *uri, LPWSTR output, DWORD output_le return S_OK; } +static HRESULT parse_document(const Uri *uri, LPWSTR output, DWORD output_len, + DWORD *result_len) +{ + DWORD len = 0; + + /* It has to be a known scheme type, but, it can't be a file + * scheme. It also has to hierarchical. + */ + if(uri->scheme_type == URL_SCHEME_UNKNOWN || + uri->scheme_type == URL_SCHEME_FILE || + uri->authority_start == -1) { + *result_len = 0; + if(output_len < 1) + return STRSAFE_E_INSUFFICIENT_BUFFER; + + output[0] = 0; + return S_OK; + } + + if(uri->fragment_start > -1) + len = uri->fragment_start; + else + len = uri->canon_len; + + *result_len = len; + if(len+1 > output_len) + return STRSAFE_E_INSUFFICIENT_BUFFER; + + memcpy(output, uri->canon_uri, len*sizeof(WCHAR)); + output[len] = 0; + return S_OK; +} + /*********************************************************************** * CoInternetParseIUri (urlmon.@) */ @@ -6308,6 +6341,15 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d } hr = parse_rootdocument(uri, pwzResult, cchResult, pcchResult); break; + case PARSE_DOCUMENT: + if(!(uri = get_uri_obj(pIUri))) { + *pcchResult = 0; + FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n", + pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved); + return E_NOTIMPL; + } + hr = parse_document(uri, pwzResult, cchResult, pcchResult); + break; case PARSE_SECURITY_URL: case PARSE_MIME: case PARSE_SERVER: