## Summary Tests for UrlFixupW and semi stub function implementaion.
## Test results - Tests are 100% ok on my local WIN 10 pc. Wine test bot seems to be okay too. - Wine tests on debian machine
| function type | result | | ------ | ------ | | stub | 0020:url: 69802 tests executed (0 marked as todo, 0 as flaky, **200** failures), 0 skipped. | | semi stub| 0020:url: 69802 tests executed (0 marked as todo, 0 as flaky, **100** failures), 0 skipped. |
## Todos For follow up merge request(s).
- [ ] Add more tests for priority investigation, who url scheme fix up is working on windows. - [ ] Implement missing parts of fix up.
## Conclusion Semi stub implementation is an improvement to the existing solution. A grep showed that wine internals do not call this function, therefore it should not introduce any new bugs. Windows applications using/relying on the function should now work better, if not they may reveal already existing bugs.
-- v2: shlwapi/tests: Mark tests as todo for UrlFixupW.
From: Thomas Csovscity thc.fr13nd@gmail.com
--- dlls/kernelbase/path.c | 15 +- dlls/shlwapi/tests/url.c | 307 +++++++++++++++++++++++++++++++++++++++ include/shlwapi.h | 2 + 3 files changed, 323 insertions(+), 1 deletion(-)
diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c index 7eda9bd483c..be4e156bbac 100644 --- a/dlls/kernelbase/path.c +++ b/dlls/kernelbase/path.c @@ -4088,7 +4088,20 @@ INT WINAPI UrlCompareW(const WCHAR *url1, const WCHAR *url2, BOOL ignore_slash) return -1; }
-HRESULT WINAPI UrlFixupW(const WCHAR *url, WCHAR *translatedUrl, DWORD maxChars) +/* + * from Documentation: + * https://docs.microsoft.com/en-us/windows/desktop/api/shlwapi/nf-shlwapi-urlf... + * + * UrlFixupW attempts to correct a URL whose protocol identifier is incorrect. + * For example, htttp will be changed to http. + * + * LWSTDAPI UrlFixupW( + * [in] PCWSTR pcszUrl, + * [out] PWSTR pszTranslatedUrl, + * DWORD cchMax + * ); +*/ +HRESULT WINAPI UrlFixupW(PCWSTR url, PWSTR translatedUrl, DWORD maxChars) { DWORD srcLen;
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index 6870de4ee5f..20c246da076 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -1609,6 +1609,312 @@ static void test_HashData(void) } }
+/* + * Documentation: https://docs.microsoft.com/en-us/windows/desktop/api/shlwapi/nf-shlwapi-urlf... +*/ +static const struct parse_urlfixupw_test_t { + PCWSTR pcszUrl; + PCWSTR pszTranslatedUrl; + HRESULT res; +} parse_urlfixupw_tests[] = { + {L"ftp:", L"ftp://", S_OK}, + {L"http:", L"http://", S_OK}, + {L"gopher:", L"gopher:", S_OK}, + {L"mailto:", L"mailto:", S_OK}, + {L"news:", L"news:", S_OK}, + {L"nntp:", L"nntp:", S_OK}, + {L"telnet:", L"telnet:", S_OK}, + {L"wais:", L"wais:", S_OK}, + {L"file:", L"file:", S_OK}, + {L"mk:", L"mk:", S_OK}, + {L"https:", L"https://", S_OK}, + {L"shell:", L"shell:", S_OK}, + {L"snews:", L"snews:", S_OK}, + {L"local:", L"local:", S_OK}, + {L"javascript:", L"javascript:", S_OK}, + {L"vbscript:", L"vbscript:", S_OK}, + {L"about:", L"about:", S_OK}, + {L"res:", L"res:", S_OK}, + {L"ms-shell-rooted:", L"ms-shell-rooted:", S_OK}, + {L"ms-shell-idlist:", L"ms-shell-idlist:", S_OK}, + {L"hcp:", L"hcp:", S_OK}, + +//not in winxp {L"*:", L"*://", S_OK}, +//not in winxp {L"search-ms:", L"search-ms://", S_OK}, +//not in winxp {L"search:", L"search://", S_OK}, +//not in winxp {L"knownfolder:", L"knownfolder://", S_OK}, + + /* proposed URL is already acceptable */ + {L"mailto:abc@abc.de", L"mailto:abc@abc.de", S_OK}, + {L"ftp://", L"ftp://", S_OK}, + {L"http://", L"http://", S_OK}, + {L"https:", L"https://", S_OK}, + + /* typos in front one letter */ + {L"aftp://", L"ftp://", S_OK}, + {L"ahttp://", L"http://", S_OK}, + {L"agopher://", L"gopher://", S_OK}, + {L"amailto://", L"mailto://", S_OK}, + {L"anews://", L"snews://", S_OK}, + {L"anntp://", L"nntp://", S_OK}, + {L"atelnet://", L"telnet://", S_OK}, + {L"awais://", L"wais://", S_OK}, + {L"afile://", L"file://", S_OK}, + {L"amk://", L"mk://", S_OK}, + {L"ahttps://", L"http://", S_OK}, + {L"ashell://", L"shell://", S_OK}, + {L"asnews://", L"snews://", S_OK}, + {L"alocal://", L"local://", S_OK}, + {L"ajavascript://", L"javascript://", S_OK}, + {L"avbscript://", L"vbscript://", S_OK}, + {L"aabout://", L"about://", S_OK}, + {L"ares://", L"res://", S_OK}, + {L"ams-shell-rooted://", L"ms-shell-rooted://", S_OK}, + {L"ams-shell-idlist://", L"ms-shell-idlist://", S_OK}, + {L"ahcp://", L"hcp://", S_OK}, + + /* typos in front two letters */ + {L"bahttp://", L"about://", S_OK}, + {L"banews://", L"snews://", S_OK}, + {L"bavbscript://", L"javascript://", S_OK}, + + /* typos in front three letters */ + {L"cbavbscript://", L"javascript://", S_OK}, + + /* typos mixed up letters */ + {L"ftt://", L"ftp://", S_OK}, + {L"gophsr://", L"gopher://", S_OK}, + {L"gophs://", L"gopher://", S_OK}, + {L"gophss://", L"gopher://", S_OK}, + {L"gophsss://", L"gopher://", S_OK}, + {L"gophsss://", L"gopher://", S_OK}, + {L"mkilto://", L"mailto://", S_OK}, + {L"mkklto://", L"mailto://", S_OK}, + {L"mkikto://", L"mailto://", S_OK}, + {L"mkiktoo://", L"mailto://", S_OK}, + {L"ma://", L"mk://", S_OK}, + {L"hftp:", L"http://", S_OK}, + + /* typos missed letters */ + {L"ft:", L"ftp://", S_OK}, + {L"ft://", L"ftp://", S_OK}, + {L"htt://", L"http://", S_OK}, + {L"gophe://", L"gopher://", S_OK}, + {L"goph://", L"gopher://", S_OK}, + {L"mailt://", L"mailto://", S_OK}, + {L"mail://", L"mailto://", S_OK}, + + {L"new://", L"news://", S_OK}, + {L"ne://", L"news://", S_OK}, + {L"snews://", L"snews://", S_OK}, + {L"newss://", L"snews://", S_OK}, + {L"newsss://", L"snews://", S_OK}, + {L"newssss://", L"snews://", S_OK}, + {L"newsssss://", L"snews://", S_OK}, + + /* typos letters behind*/ + {L"mks://", L"mk://", S_OK}, + {L"mkss://", L"mk://", S_OK}, + {L"mailtooo://", L"mailto://", S_OK}, + {L"mailtoooo://", L"mailto://", S_OK}, + {L"mailtooooo://", L"mailto://", S_OK}, + + /* typos fixing two letters */ + {L"cc:", L"hcp:", S_OK}, + {L"ee:", L"res:", S_OK}, + {L"ff:", L"ftp://", S_OK}, + {L"hh:", L"hcp:", S_OK}, + {L"kk:", L"mk:", S_OK}, + {L"mm:", L"mk:", S_OK}, + {L"nn:", L"nntp:", S_OK}, + {L"rr:", L"res:", S_OK}, + {L"tt:", L"ftp://", S_OK}, + + /* reporting false */ + {L"baftp://", NULL, S_FALSE}, + {L"bagopher://", NULL, S_FALSE}, + {L"bamailto://", NULL, S_FALSE}, + {L"banntp://", NULL, S_FALSE}, + {L"batelnet://", NULL, S_FALSE}, + {L"bawais://", NULL, S_FALSE}, + {L"bafile://", NULL, S_FALSE}, + {L"bamk://", NULL, S_FALSE}, + {L"bahttps://", NULL, S_FALSE}, + {L"bashell://", NULL, S_FALSE}, + {L"basnews://", NULL, S_FALSE}, + {L"balocal://", NULL, S_FALSE}, + {L"bajavascript://", NULL, S_FALSE}, + {L"baabout://", NULL, S_FALSE}, + {L"bares://", NULL, S_FALSE}, + {L"bams-shell-rooted://", NULL, S_FALSE}, + {L"bams-shell-idlist://", NULL, S_FALSE}, + {L"bahcp://", NULL, S_FALSE}, + + {L"cbaftp://", NULL, S_FALSE}, + {L"cbahttp://", NULL, S_FALSE}, + {L"cbanews://", NULL, S_FALSE}, + {L"cbagopher://", NULL, S_FALSE}, + {L"cbamailto://", NULL, S_FALSE}, + {L"cbanntp://", NULL, S_FALSE}, + {L"cbatelnet://", NULL, S_FALSE}, + {L"cbawais://", NULL, S_FALSE}, + {L"cbafile://", NULL, S_FALSE}, + {L"cbamk://", NULL, S_FALSE}, + {L"cbahttps://", NULL, S_FALSE}, + {L"cbashell://", NULL, S_FALSE}, + {L"cbasnews://", NULL, S_FALSE}, + {L"cbalocal://", NULL, S_FALSE}, + {L"cbajavascript://", NULL, S_FALSE}, + {L"cbaabout://", NULL, S_FALSE}, + {L"cbares://", NULL, S_FALSE}, + {L"cbams-shell-rooted://", NULL, S_FALSE}, + {L"cbams-shell-idlist://", NULL, S_FALSE}, + {L"cbahcp://", NULL, S_FALSE}, + + /* without ":" never matched in winxp */ + {L"a", NULL, S_FALSE}, + {L"mk", NULL, S_FALSE}, + {L"ftp", NULL, S_FALSE}, + + /* one letter never matched in winxp */ + {L"a:", NULL, S_FALSE}, + {L"b:", NULL, S_FALSE}, + {L"c:", NULL, S_FALSE}, + {L"d:", NULL, S_FALSE}, + {L"e:", NULL, S_FALSE}, + {L"f:", NULL, S_FALSE}, + {L"g:", NULL, S_FALSE}, + {L"h:", NULL, S_FALSE}, + {L"i:", NULL, S_FALSE}, + {L"j:", NULL, S_FALSE}, + {L"k:", NULL, S_FALSE}, + {L"l:", NULL, S_FALSE}, + {L"m:", NULL, S_FALSE}, + {L"n:", NULL, S_FALSE}, + {L"o:", NULL, S_FALSE}, + {L"p:", NULL, S_FALSE}, + {L"q:", NULL, S_FALSE}, + {L"r:", NULL, S_FALSE}, + {L"s:", NULL, S_FALSE}, + {L"t:", NULL, S_FALSE}, + {L"u:", NULL, S_FALSE}, + {L"v:", NULL, S_FALSE}, + {L"w:", NULL, S_FALSE}, + {L"x:", NULL, S_FALSE}, + {L"y:", NULL, S_FALSE}, + {L"z:", NULL, S_FALSE}, + + {L"gophssss://", NULL, S_FALSE}, + {L"gop://", NULL, S_FALSE}, + {L"go://", NULL, S_FALSE}, + {L"mai://", NULL, S_FALSE}, + + {L"mkkkto://", NULL, S_FALSE}, + {L"mailtoooooo://", NULL, S_FALSE}, + {L"mailtooooop://", NULL, S_FALSE}, + {L"newssssss://", NULL, S_FALSE}, + {L"mkikkoo://", NULL, S_FALSE}, + {L"mksss://", NULL, S_FALSE}, + {L"ft", NULL, S_FALSE}, + + /* mixed tests */ + {L"aa:", NULL, S_FALSE}, + {L"bb:", NULL, S_FALSE}, + {L"dd:", NULL, S_FALSE}, + {L"gg:", NULL, S_FALSE}, + {L"ii:", NULL, S_FALSE}, + {L"jj:", NULL, S_FALSE}, + {L"ll:", NULL, S_FALSE}, + {L"oo:", NULL, S_FALSE}, + {L"pp:", NULL, S_FALSE}, + {L"qq:", NULL, S_FALSE}, + {L"ss:", NULL, S_FALSE}, + {L"uu:", NULL, S_FALSE}, + {L"vv:", NULL, S_FALSE}, + {L"ww:", NULL, S_FALSE}, + {L"xx:", NULL, S_FALSE}, + {L"yy:", NULL, S_FALSE}, + {L"zz:", NULL, S_FALSE}, + + /* taken from example in documentation */ + {L"http://www.microsoft.com", L"http://www.microsoft.com", S_OK}, + {L"http:www.microsoft.com", L"http://www.microsoft.com", S_OK}, + {L"mail:someone@example.com", L"mailto:someone@example.com", S_OK}, + {L"htpp:wwwmicrosoft.com", L"http://wwwmicrosoft.com", S_OK}, + {L"htps:\www.microsoft.com", L"http://www.microsoft.com", S_OK}, + {L"http:someone@example.com", L"http://someone@example.com", S_OK}, + {L"abc:def", NULL, S_FALSE}, + {L"someone@example.com", NULL, S_FALSE}, + + {L"fztzp:", NULL, S_FALSE}, + {L"zfztzp:", NULL, S_FALSE}, + {L"zfztp:", NULL, S_FALSE}, + {L"zftzp:", NULL, S_FALSE}, + {L"zftpz:", NULL, S_FALSE}, + + {L"htztps:", L"http://", S_OK}, + {L"hzttps:", L"http://", S_OK}, + {L"htzztps:", NULL, S_FALSE}, + {L"hzzzzzzzzzzzzzztp:", NULL, S_FALSE}, + {L"hzzzzzzzzzzzzzztpz:", NULL, S_FALSE}, + {L"zhzzzzzzzzzzzzzztp:", NULL, S_FALSE}, + {L"zhzzzzzzzzzzzzzztpz:", NULL, S_FALSE}, + {L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:", NULL, S_FALSE}, + + {L"hfttp:", L"http://", S_OK}, + {L"hfttpz:", L"http://", S_OK}, + {L"zhftp:", NULL, S_FALSE}, + {L"hftftpz:", NULL, S_FALSE}, + {L"hftddtpz:", NULL, S_FALSE}, + {L"hftddtddpz:", NULL, S_FALSE}, + + {L"hfftp:", L"http://", S_OK}, + {L"hftpz:", L"http://", S_OK}, + {L"hztpz:", L"http://", S_OK}, + + {L"httpz:", L"http://", S_OK}, + {L"httpsz:", L"http://", S_OK}, + {L"httpzz:", L"http://", S_OK}, + {L"httpzzz:", L"http://", S_OK}, + {L"httpzzzz:", NULL, S_FALSE}, + {L"httpzzzzz:", NULL, S_FALSE}, +}; + +#define MAX_URL 256 + +static void test_UrlFixupW(void) +{ + const struct parse_urlfixupw_test_t *test; + WCHAR pszTranslatedUrl[MAX_URL]; + LPWSTR TranslatedUrl = pszTranslatedUrl; + HRESULT hres; + + trace("test_UrlFixupW\n"); + for (test = parse_urlfixupw_tests; test < parse_urlfixupw_tests + ARRAY_SIZE(parse_urlfixupw_tests); test++) { + pszTranslatedUrl[0] = 0; + hres = UrlFixupW(test->pcszUrl, TranslatedUrl,MAX_URL); + if (test->res == hres ) { + if (S_OK == hres) { + ok(_wcsicmp(TranslatedUrl, test->pszTranslatedUrl) == 0, "Expected %s got %s for %s\n", + wine_dbgstr_w(test->pszTranslatedUrl), wine_dbgstr_w(TranslatedUrl), wine_dbgstr_w(test->pcszUrl)); + } else if (S_FALSE == hres) { + ok(test->res == hres, "Expected %lu got %lu for %s\n", + test->res, hres, wine_dbgstr_w(test->pcszUrl)); + } else { + printf("failed %S with %lu \n", test->pcszUrl, hres); + } + } else { + if (S_OK == hres) { + ok(test->res == hres, "Expected %lu got %lu for %s fixed: %s\n", + test->res, hres, wine_dbgstr_w(test->pcszUrl), wine_dbgstr_w(TranslatedUrl)); + } else { + ok(test->res == hres, "Expected %lu got %lu for %s\n", + test->res, hres, wine_dbgstr_w(test->pcszUrl)); + } + } + } +} + /* ########################### */
START_TEST(url) @@ -1626,4 +1932,5 @@ START_TEST(url) test_UrlUnescape(); test_ParseURL(); test_HashData(); + test_UrlFixupW(); } diff --git a/include/shlwapi.h b/include/shlwapi.h index eee41abf0dc..b3a27b5c403 100644 --- a/include/shlwapi.h +++ b/include/shlwapi.h @@ -701,6 +701,8 @@ WINSHLWAPI INT WINAPI UrlCompareA(LPCSTR,LPCSTR,BOOL); WINSHLWAPI INT WINAPI UrlCompareW(LPCWSTR,LPCWSTR,BOOL); #define UrlCompare WINELIB_NAME_AW(UrlCompare)
+WINSHLWAPI HRESULT WINAPI UrlFixupW(PCWSTR,PWSTR,DWORD); + WINSHLWAPI HRESULT WINAPI UrlEscapeA(LPCSTR,LPSTR,LPDWORD,DWORD); WINSHLWAPI HRESULT WINAPI UrlEscapeW(LPCWSTR,LPWSTR,LPDWORD,DWORD); #define UrlEscape WINELIB_NAME_AW(UrlEscape)
From: Thomas Csovscity thc.fr13nd@gmail.com
--- dlls/kernelbase/path.c | 128 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 123 insertions(+), 5 deletions(-)
diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c index be4e156bbac..b2dd5f2ffc9 100644 --- a/dlls/kernelbase/path.c +++ b/dlls/kernelbase/path.c @@ -4103,17 +4103,135 @@ INT WINAPI UrlCompareW(const WCHAR *url1, const WCHAR *url2, BOOL ignore_slash) */ HRESULT WINAPI UrlFixupW(PCWSTR url, PWSTR translatedUrl, DWORD maxChars) { - DWORD srcLen; + DWORD srcLen, dstLen, len; + DWORD colon_pos = 0, pos = 0; + wchar_t *helper_str = NULL; + PWSTR save_str = translatedUrl;
- FIXME("%s, %p, %ld stub\n", wine_dbgstr_w(url), translatedUrl, maxChars); + const WCHAR *url_scheme[] = { L"", L"ftp:", L"https:", L"gopher:", L"mailto:", L"news:", + L"nntp:", L"telnet:", L"wais:", L"file:", L"mk:", + L"http:", L"shell:", L"snews:", L"local:", + L"javascript:", L"vbscript:", L"about:", L"res:", + L"ms-shell-rooted:", L"ms-shell-idlist:", L"hcp:"}; + + const WCHAR *url_scheme_short[] = { L"", L"ftp", L"https", L"gopher", L"mailto", L"snews", + L"nntp", L"telnet", L"wais", L"file", L"mk", + L"http", L"ms-shell-rooted", L"news", L"local", + L"javascript", L"vbscript", L"about", L"res", + L"ms-shell-idlist", L"shell", L"hcp"}; + + FIXME("%s, %p, %ld semi-stub\n", wine_dbgstr_w(url), translatedUrl, maxChars);
if (!url) return E_FAIL;
- srcLen = lstrlenW(url) + 1; + /* + * First check for known, valid and typo free scheme + */ + for (pos=1; pos<ARRAY_SIZE(url_scheme); pos++) + { + len = wcslen(url_scheme[pos]); + if ( (len <= wcslen(url)) && (!_wcsnicmp(url, url_scheme[pos], len)) ) + { + /* + * check if string fits into maxChars + */ + if (len+1 >= maxChars) + return S_FALSE; + + lstrcpynW(save_str, url_scheme[pos], len+1); + url += len; + goto scheme_done; + } + } + + /* + * url has to contain at least one colon. + * The scheme part length has a minimum of 2 characters. + * Output buffer length has to be minimum of 3 characters, scheme + colon. + * + * Return S_FALSE if url and buffer do not meet this minimum requirements. + */ + helper_str = wcschr(url, L':'); + if (!helper_str) + return S_FALSE;
- /* For now just copy the URL directly */ - lstrcpynW(translatedUrl, url, (maxChars < srcLen) ? maxChars : srcLen); + colon_pos = helper_str-url; + if (helper_str && (1 >= colon_pos)) + return S_FALSE; + /* + * check if string fits into maxChars + */ + // TODO: Use own buffer for adjustments, output buffer may not fit before fix + if (colon_pos >= maxChars && maxChars < 3) + return S_FALSE; + + /* + * Set potential scheme + */ + lstrcpynW(save_str, url, pos+2); + url = url + colon_pos + 1; + + /* + * Find schemes with trailing or leading typos + */ + for (pos=1; pos<ARRAY_SIZE(url_scheme_short); pos++) + { + /* http is always prefered before https, if string has typos */ + len = wcslen(url_scheme_short[pos]); + if (!_wcsnicmp(url_scheme_short[pos], L"https", len+1)) + { + continue; + } + if ( (len <= wcslen(save_str)) && (StrStrIW(save_str, url_scheme_short[pos])) ) + { + /* + * check if string fits into maxChars + */ + if (len+1 >= maxChars) + return S_FALSE; + + lstrcpynW(save_str, url_scheme_short[pos], len+1); + lstrcatW(save_str, L":"); + goto scheme_done; + } + } + + /* Return false in most remaining cases should be safe */ + return S_FALSE; + + /* Concat scheme + rest */ +scheme_done: + /* + * Concat L"://"" for ftp, http, https scheme + * else ":" + */ + if ( 0 == lstrcmpW(save_str, L"ftp:") || + 0 == lstrcmpW(save_str, L"http:") || + 0 == lstrcmpW(save_str, L"https:") ) + { + if ( url[0] == L'\' || url[0] == L'/' ) + { + url++; + if ( url[0] == L'\' || url[0] == L'/' ) + url++; + } + lstrcatW(save_str, L"//"); + } + /* + * Remove leading "/", "" and ":" from url. + * Output already have them if needed + */ + while ( url[0] == L'\' || url[0] == L'/' ) + { + lstrcatW(save_str, L"/"); + url++; + } + + /* Add the URL path */ + srcLen = lstrlenW(url) + 1; + dstLen = maxChars - lstrlenW(save_str); + lstrcpynW(save_str+lstrlenW(save_str), url, (dstLen < srcLen) ? dstLen : srcLen);
return S_OK; }
From: Thomas Csovscity thc.fr13nd@gmail.com
Mark actually failing test, because of semi-stub function, as todo. This satisfies test bots. --- dlls/shlwapi/tests/url.c | 239 ++++++++++++++++++++------------------- 1 file changed, 122 insertions(+), 117 deletions(-)
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index 20c246da076..1ee83cf58d9 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -1616,6 +1616,7 @@ static const struct parse_urlfixupw_test_t { PCWSTR pcszUrl; PCWSTR pszTranslatedUrl; HRESULT res; + BOOL todo; } parse_urlfixupw_tests[] = { {L"ftp:", L"ftp://", S_OK}, {L"http:", L"http://", S_OK}, @@ -1655,7 +1656,7 @@ static const struct parse_urlfixupw_test_t { {L"ahttp://", L"http://", S_OK}, {L"agopher://", L"gopher://", S_OK}, {L"amailto://", L"mailto://", S_OK}, - {L"anews://", L"snews://", S_OK}, + {L"anews://", L"snews://", S_OK, TRUE}, {L"anntp://", L"nntp://", S_OK}, {L"atelnet://", L"telnet://", S_OK}, {L"awais://", L"wais://", S_OK}, @@ -1674,43 +1675,43 @@ static const struct parse_urlfixupw_test_t { {L"ahcp://", L"hcp://", S_OK},
/* typos in front two letters */ - {L"bahttp://", L"about://", S_OK}, - {L"banews://", L"snews://", S_OK}, - {L"bavbscript://", L"javascript://", S_OK}, + {L"bahttp://", L"about://", S_OK, TRUE}, + {L"banews://", L"snews://", S_OK, TRUE}, + {L"bavbscript://", L"javascript://", S_OK, TRUE},
/* typos in front three letters */ - {L"cbavbscript://", L"javascript://", S_OK}, + {L"cbavbscript://", L"javascript://", S_OK, TRUE},
/* typos mixed up letters */ - {L"ftt://", L"ftp://", S_OK}, - {L"gophsr://", L"gopher://", S_OK}, - {L"gophs://", L"gopher://", S_OK}, - {L"gophss://", L"gopher://", S_OK}, - {L"gophsss://", L"gopher://", S_OK}, - {L"gophsss://", L"gopher://", S_OK}, - {L"mkilto://", L"mailto://", S_OK}, - {L"mkklto://", L"mailto://", S_OK}, - {L"mkikto://", L"mailto://", S_OK}, - {L"mkiktoo://", L"mailto://", S_OK}, - {L"ma://", L"mk://", S_OK}, - {L"hftp:", L"http://", S_OK}, + {L"ftt://", L"ftp://", S_OK, TRUE}, + {L"gophsr://", L"gopher://", S_OK, TRUE}, + {L"gophs://", L"gopher://", S_OK, TRUE}, + {L"gophss://", L"gopher://", S_OK, TRUE}, + {L"gophsss://", L"gopher://", S_OK, TRUE}, + {L"gophsss://", L"gopher://", S_OK, TRUE}, + {L"mkilto://", L"mailto://", S_OK, TRUE}, + {L"mkklto://", L"mailto://", S_OK, TRUE}, + {L"mkikto://", L"mailto://", S_OK, TRUE}, + {L"mkiktoo://", L"mailto://", S_OK, TRUE}, + {L"ma://", L"mk://", S_OK, TRUE}, + {L"hftp:", L"http://", S_OK, TRUE},
/* typos missed letters */ - {L"ft:", L"ftp://", S_OK}, - {L"ft://", L"ftp://", S_OK}, - {L"htt://", L"http://", S_OK}, - {L"gophe://", L"gopher://", S_OK}, - {L"goph://", L"gopher://", S_OK}, - {L"mailt://", L"mailto://", S_OK}, - {L"mail://", L"mailto://", S_OK}, - - {L"new://", L"news://", S_OK}, - {L"ne://", L"news://", S_OK}, + {L"ft:", L"ftp://", S_OK, TRUE}, + {L"ft://", L"ftp://", S_OK, TRUE}, + {L"htt://", L"http://", S_OK, TRUE}, + {L"gophe://", L"gopher://", S_OK, TRUE}, + {L"goph://", L"gopher://", S_OK, TRUE}, + {L"mailt://", L"mailto://", S_OK, TRUE}, + {L"mail://", L"mailto://", S_OK, TRUE}, + + {L"new://", L"news://", S_OK, TRUE}, + {L"ne://", L"news://", S_OK, TRUE}, {L"snews://", L"snews://", S_OK}, - {L"newss://", L"snews://", S_OK}, - {L"newsss://", L"snews://", S_OK}, - {L"newssss://", L"snews://", S_OK}, - {L"newsssss://", L"snews://", S_OK}, + {L"newss://", L"snews://", S_OK, TRUE}, + {L"newsss://", L"snews://", S_OK, TRUE}, + {L"newssss://", L"snews://", S_OK, TRUE}, + {L"newsssss://", L"snews://", S_OK, TRUE},
/* typos letters behind*/ {L"mks://", L"mk://", S_OK}, @@ -1720,56 +1721,56 @@ static const struct parse_urlfixupw_test_t { {L"mailtooooo://", L"mailto://", S_OK},
/* typos fixing two letters */ - {L"cc:", L"hcp:", S_OK}, - {L"ee:", L"res:", S_OK}, - {L"ff:", L"ftp://", S_OK}, - {L"hh:", L"hcp:", S_OK}, - {L"kk:", L"mk:", S_OK}, - {L"mm:", L"mk:", S_OK}, - {L"nn:", L"nntp:", S_OK}, - {L"rr:", L"res:", S_OK}, - {L"tt:", L"ftp://", S_OK}, + {L"cc:", L"hcp:", S_OK, TRUE}, + {L"ee:", L"res:", S_OK, TRUE}, + {L"ff:", L"ftp://", S_OK, TRUE}, + {L"hh:", L"hcp:", S_OK, TRUE}, + {L"kk:", L"mk:", S_OK, TRUE}, + {L"mm:", L"mk:", S_OK, TRUE}, + {L"nn:", L"nntp:", S_OK, TRUE}, + {L"rr:", L"res:", S_OK, TRUE}, + {L"tt:", L"ftp://", S_OK, TRUE},
/* reporting false */ - {L"baftp://", NULL, S_FALSE}, - {L"bagopher://", NULL, S_FALSE}, - {L"bamailto://", NULL, S_FALSE}, - {L"banntp://", NULL, S_FALSE}, - {L"batelnet://", NULL, S_FALSE}, - {L"bawais://", NULL, S_FALSE}, - {L"bafile://", NULL, S_FALSE}, - {L"bamk://", NULL, S_FALSE}, - {L"bahttps://", NULL, S_FALSE}, - {L"bashell://", NULL, S_FALSE}, - {L"basnews://", NULL, S_FALSE}, - {L"balocal://", NULL, S_FALSE}, - {L"bajavascript://", NULL, S_FALSE}, - {L"baabout://", NULL, S_FALSE}, - {L"bares://", NULL, S_FALSE}, - {L"bams-shell-rooted://", NULL, S_FALSE}, - {L"bams-shell-idlist://", NULL, S_FALSE}, - {L"bahcp://", NULL, S_FALSE}, - - {L"cbaftp://", NULL, S_FALSE}, - {L"cbahttp://", NULL, S_FALSE}, - {L"cbanews://", NULL, S_FALSE}, - {L"cbagopher://", NULL, S_FALSE}, - {L"cbamailto://", NULL, S_FALSE}, - {L"cbanntp://", NULL, S_FALSE}, - {L"cbatelnet://", NULL, S_FALSE}, - {L"cbawais://", NULL, S_FALSE}, - {L"cbafile://", NULL, S_FALSE}, - {L"cbamk://", NULL, S_FALSE}, - {L"cbahttps://", NULL, S_FALSE}, - {L"cbashell://", NULL, S_FALSE}, - {L"cbasnews://", NULL, S_FALSE}, - {L"cbalocal://", NULL, S_FALSE}, - {L"cbajavascript://", NULL, S_FALSE}, - {L"cbaabout://", NULL, S_FALSE}, - {L"cbares://", NULL, S_FALSE}, - {L"cbams-shell-rooted://", NULL, S_FALSE}, - {L"cbams-shell-idlist://", NULL, S_FALSE}, - {L"cbahcp://", NULL, S_FALSE}, + {L"baftp://", NULL, S_FALSE, TRUE}, + {L"bagopher://", NULL, S_FALSE, TRUE}, + {L"bamailto://", NULL, S_FALSE, TRUE}, + {L"banntp://", NULL, S_FALSE, TRUE}, + {L"batelnet://", NULL, S_FALSE, TRUE}, + {L"bawais://", NULL, S_FALSE, TRUE}, + {L"bafile://", NULL, S_FALSE, TRUE}, + {L"bamk://", NULL, S_FALSE, TRUE}, + {L"bahttps://", NULL, S_FALSE, TRUE}, + {L"bashell://", NULL, S_FALSE, TRUE}, + {L"basnews://", NULL, S_FALSE, TRUE}, + {L"balocal://", NULL, S_FALSE, TRUE}, + {L"bajavascript://", NULL, S_FALSE, TRUE}, + {L"baabout://", NULL, S_FALSE, TRUE}, + {L"bares://", NULL, S_FALSE, TRUE}, + {L"bams-shell-rooted://", NULL, S_FALSE, TRUE}, + {L"bams-shell-idlist://", NULL, S_FALSE, TRUE}, + {L"bahcp://", NULL, S_FALSE, TRUE}, + + {L"cbaftp://", NULL, S_FALSE, TRUE}, + {L"cbahttp://", NULL, S_FALSE, TRUE}, + {L"cbanews://", NULL, S_FALSE, TRUE}, + {L"cbagopher://", NULL, S_FALSE, TRUE}, + {L"cbamailto://", NULL, S_FALSE, TRUE}, + {L"cbanntp://", NULL, S_FALSE, TRUE}, + {L"cbatelnet://", NULL, S_FALSE, TRUE}, + {L"cbawais://", NULL, S_FALSE, TRUE}, + {L"cbafile://", NULL, S_FALSE, TRUE}, + {L"cbamk://", NULL, S_FALSE, TRUE}, + {L"cbahttps://", NULL, S_FALSE, TRUE}, + {L"cbashell://", NULL, S_FALSE, TRUE}, + {L"cbasnews://", NULL, S_FALSE, TRUE}, + {L"cbalocal://", NULL, S_FALSE, TRUE}, + {L"cbajavascript://", NULL, S_FALSE, TRUE}, + {L"cbaabout://", NULL, S_FALSE, TRUE}, + {L"cbares://", NULL, S_FALSE, TRUE}, + {L"cbams-shell-rooted://", NULL, S_FALSE, TRUE}, + {L"cbams-shell-idlist://", NULL, S_FALSE, TRUE}, + {L"cbahcp://", NULL, S_FALSE, TRUE},
/* without ":" never matched in winxp */ {L"a", NULL, S_FALSE}, @@ -1809,12 +1810,12 @@ static const struct parse_urlfixupw_test_t { {L"go://", NULL, S_FALSE}, {L"mai://", NULL, S_FALSE},
- {L"mkkkto://", NULL, S_FALSE}, - {L"mailtoooooo://", NULL, S_FALSE}, - {L"mailtooooop://", NULL, S_FALSE}, - {L"newssssss://", NULL, S_FALSE}, - {L"mkikkoo://", NULL, S_FALSE}, - {L"mksss://", NULL, S_FALSE}, + {L"mkkkto://", NULL, S_FALSE, TRUE}, + {L"mailtoooooo://", NULL, S_FALSE, TRUE}, + {L"mailtooooop://", NULL, S_FALSE, TRUE}, + {L"newssssss://", NULL, S_FALSE, TRUE}, + {L"mkikkoo://", NULL, S_FALSE, TRUE}, + {L"mksss://", NULL, S_FALSE, TRUE}, {L"ft", NULL, S_FALSE},
/* mixed tests */ @@ -1839,9 +1840,9 @@ static const struct parse_urlfixupw_test_t { /* taken from example in documentation */ {L"http://www.microsoft.com", L"http://www.microsoft.com", S_OK}, {L"http:www.microsoft.com", L"http://www.microsoft.com", S_OK}, - {L"mail:someone@example.com", L"mailto:someone@example.com", S_OK}, - {L"htpp:wwwmicrosoft.com", L"http://wwwmicrosoft.com", S_OK}, - {L"htps:\www.microsoft.com", L"http://www.microsoft.com", S_OK}, + {L"mail:someone@example.com", L"mailto:someone@example.com", S_OK, TRUE}, + {L"htpp:wwwmicrosoft.com", L"http://wwwmicrosoft.com", S_OK, TRUE}, + {L"htps:\www.microsoft.com", L"http://www.microsoft.com", S_OK, TRUE}, {L"http:someone@example.com", L"http://someone@example.com", S_OK}, {L"abc:def", NULL, S_FALSE}, {L"someone@example.com", NULL, S_FALSE}, @@ -1850,10 +1851,10 @@ static const struct parse_urlfixupw_test_t { {L"zfztzp:", NULL, S_FALSE}, {L"zfztp:", NULL, S_FALSE}, {L"zftzp:", NULL, S_FALSE}, - {L"zftpz:", NULL, S_FALSE}, + {L"zftpz:", NULL, S_FALSE, TRUE},
- {L"htztps:", L"http://", S_OK}, - {L"hzttps:", L"http://", S_OK}, + {L"htztps:", L"http://", S_OK, TRUE}, + {L"hzttps:", L"http://", S_OK, TRUE}, {L"htzztps:", NULL, S_FALSE}, {L"hzzzzzzzzzzzzzztp:", NULL, S_FALSE}, {L"hzzzzzzzzzzzzzztpz:", NULL, S_FALSE}, @@ -1861,23 +1862,23 @@ static const struct parse_urlfixupw_test_t { {L"zhzzzzzzzzzzzzzztpz:", NULL, S_FALSE}, {L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:", NULL, S_FALSE},
- {L"hfttp:", L"http://", S_OK}, - {L"hfttpz:", L"http://", S_OK}, - {L"zhftp:", NULL, S_FALSE}, - {L"hftftpz:", NULL, S_FALSE}, + {L"hfttp:", L"http://", S_OK, TRUE}, + {L"hfttpz:", L"http://", S_OK, TRUE}, + {L"zhftp:", NULL, S_FALSE, TRUE}, + {L"hftftpz:", NULL, S_FALSE, TRUE}, {L"hftddtpz:", NULL, S_FALSE}, {L"hftddtddpz:", NULL, S_FALSE},
- {L"hfftp:", L"http://", S_OK}, - {L"hftpz:", L"http://", S_OK}, - {L"hztpz:", L"http://", S_OK}, + {L"hfftp:", L"http://", S_OK, TRUE}, + {L"hftpz:", L"http://", S_OK, TRUE}, + {L"hztpz:", L"http://", S_OK, TRUE},
{L"httpz:", L"http://", S_OK}, {L"httpsz:", L"http://", S_OK}, {L"httpzz:", L"http://", S_OK}, {L"httpzzz:", L"http://", S_OK}, - {L"httpzzzz:", NULL, S_FALSE}, - {L"httpzzzzz:", NULL, S_FALSE}, + {L"httpzzzz:", NULL, S_FALSE, TRUE}, + {L"httpzzzzz:", NULL, S_FALSE, TRUE}, };
#define MAX_URL 256 @@ -1891,25 +1892,29 @@ static void test_UrlFixupW(void)
trace("test_UrlFixupW\n"); for (test = parse_urlfixupw_tests; test < parse_urlfixupw_tests + ARRAY_SIZE(parse_urlfixupw_tests); test++) { - pszTranslatedUrl[0] = 0; - hres = UrlFixupW(test->pcszUrl, TranslatedUrl,MAX_URL); - if (test->res == hres ) { - if (S_OK == hres) { - ok(_wcsicmp(TranslatedUrl, test->pszTranslatedUrl) == 0, "Expected %s got %s for %s\n", - wine_dbgstr_w(test->pszTranslatedUrl), wine_dbgstr_w(TranslatedUrl), wine_dbgstr_w(test->pcszUrl)); - } else if (S_FALSE == hres) { - ok(test->res == hres, "Expected %lu got %lu for %s\n", - test->res, hres, wine_dbgstr_w(test->pcszUrl)); + trace("test_UrlFixupW, flag %s\n", test->todo ? "todo" : "run"); + todo_wine_if (test->todo) + { + pszTranslatedUrl[0] = 0; + hres = UrlFixupW(test->pcszUrl, TranslatedUrl,MAX_URL); + if (test->res == hres ) { + if (S_OK == hres) { + ok(_wcsicmp(TranslatedUrl, test->pszTranslatedUrl) == 0,"Expected %s got %s for %s\n", + wine_dbgstr_w(test->pszTranslatedUrl), wine_dbgstr_w(TranslatedUrl), wine_dbgstr_w(test->pcszUrl)); + } else if (S_FALSE == hres) { + ok(test->res == hres, "Expected %lu got %lu for %s\n", + test->res, hres, wine_dbgstr_w(test->pcszUrl)); + } else { + printf("failed %S with %lu \n", test->pcszUrl, hres); + } + } else { + if (S_OK == hres) { + ok(test->res == hres, "Expected %lu got %lu for %s fixed: %s\n", + test->res, hres, wine_dbgstr_w(test->pcszUrl), wine_dbgstr_w(TranslatedUrl)); } else { - printf("failed %S with %lu \n", test->pcszUrl, hres); + ok(test->res == hres, "Expected %lu got %lu for %s\n", + test->res, hres, wine_dbgstr_w(test->pcszUrl)); } - } else { - if (S_OK == hres) { - ok(test->res == hres, "Expected %lu got %lu for %s fixed: %s\n", - test->res, hres, wine_dbgstr_w(test->pcszUrl), wine_dbgstr_w(TranslatedUrl)); - } else { - ok(test->res == hres, "Expected %lu got %lu for %s\n", - test->res, hres, wine_dbgstr_w(test->pcszUrl)); } } }