Andrew Eikum : ieframe: Strip 'file://' from file URLs in BEFORENAVIGATE2 callbacks.
Alexandre Julliard
julliard at winehq.org
Thu Jan 10 13:36:10 CST 2013
Module: wine
Branch: master
Commit: 8eb70459a18f6d8a80c9570875e2c664e6afbb56
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8eb70459a18f6d8a80c9570875e2c664e6afbb56
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Wed Jan 9 10:41:59 2013 -0600
ieframe: Strip 'file://' from file URLs in BEFORENAVIGATE2 callbacks.
---
dlls/ieframe/navigate.c | 7 ++++-
dlls/ieframe/tests/webbrowser.c | 49 +++++++++++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+), 1 deletions(-)
diff --git a/dlls/ieframe/navigate.c b/dlls/ieframe/navigate.c
index dd4a976..2601ba8 100644
--- a/dlls/ieframe/navigate.c
+++ b/dlls/ieframe/navigate.c
@@ -566,6 +566,8 @@ static void on_before_navigate2(DocHost *This, LPCWSTR url, SAFEARRAY *post_data
VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers;
DISPPARAMS dispparams;
VARIANTARG params[7];
+ WCHAR file_path[MAX_PATH];
+ DWORD file_path_len = sizeof(file_path) / sizeof(*file_path);
dispparams.cArgs = 7;
dispparams.cNamedArgs = 0;
@@ -607,7 +609,10 @@ static void on_before_navigate2(DocHost *This, LPCWSTR url, SAFEARRAY *post_data
V_VT(params+5) = (VT_BYREF|VT_VARIANT);
V_VARIANTREF(params+5) = &var_url;
V_VT(&var_url) = VT_BSTR;
- V_BSTR(&var_url) = SysAllocString(url);
+ if(PathCreateFromUrlW(url, file_path, &file_path_len, 0) == S_OK)
+ V_BSTR(&var_url) = SysAllocString(file_path);
+ else
+ V_BSTR(&var_url) = SysAllocString(url);
V_VT(params+6) = (VT_DISPATCH);
V_DISPATCH(params+6) = (IDispatch*)This->wb;
diff --git a/dlls/ieframe/tests/webbrowser.c b/dlls/ieframe/tests/webbrowser.c
index 25cce8a..760618f 100644
--- a/dlls/ieframe/tests/webbrowser.c
+++ b/dlls/ieframe/tests/webbrowser.c
@@ -2542,6 +2542,7 @@ static void test_ConnectionPoint(IWebBrowser2 *unk, BOOL init)
static void test_Navigate2(IWebBrowser2 *webbrowser, const char *nav_url)
{
VARIANT url;
+ BOOL is_file;
HRESULT hres;
test_LocationURL(webbrowser, is_first_load ? "" : current_url);
@@ -2551,6 +2552,9 @@ static void test_Navigate2(IWebBrowser2 *webbrowser, const char *nav_url)
V_VT(&url) = VT_BSTR;
V_BSTR(&url) = a2bstr(current_url = nav_url);
+ if((is_file = !strncasecmp(nav_url, "file://", 7)))
+ current_url = nav_url + 7;
+
if(is_first_load) {
SET_EXPECT(Invoke_AMBIENT_USERMODE);
SET_EXPECT(Invoke_PROPERTYCHANGE);
@@ -2578,6 +2582,7 @@ static void test_Navigate2(IWebBrowser2 *webbrowser, const char *nav_url)
SET_EXPECT(Invoke_COMMANDSTATECHANGE);
SET_EXPECT(EnableModeless_TRUE);
if (!use_container_olecmd) SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
+ if (is_file) SET_EXPECT(Invoke_PROGRESSCHANGE);
}
hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
@@ -2609,6 +2614,7 @@ static void test_Navigate2(IWebBrowser2 *webbrowser, const char *nav_url)
todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
CHECK_CALLED(EnableModeless_TRUE);
+ if (is_file) todo_wine CHECK_CALLED(Invoke_PROGRESSCHANGE);
}
VariantClear(&url);
@@ -3511,6 +3517,48 @@ static BOOL is_ie_hardened(void)
return ie_harden != 0;
}
+static void test_FileProtocol(void)
+{
+ IWebBrowser2 *webbrowser;
+ HANDLE file;
+ ULONG ref;
+ char file_path[MAX_PATH];
+ char file_url[MAX_PATH] = "File://";
+
+ static const char test_file[] = "wine_test.html";
+
+ GetTempPathA(MAX_PATH, file_path);
+ strcat(file_path, test_file);
+ GetLongPathNameA(file_path, file_path, sizeof(file_path));
+ strcat(file_url, file_path);
+
+ webbrowser = create_webbrowser();
+ if(!webbrowser)
+ return;
+
+ init_test(webbrowser, 0);
+
+ file = CreateFileA(file_path, GENERIC_WRITE, 0, NULL,
+ CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
+ if(file == INVALID_HANDLE_VALUE && GetLastError() != ERROR_FILE_EXISTS){
+ ok(0, "CreateFile failed\n");
+ return;
+ }
+ CloseHandle(file);
+
+ test_ConnectionPoint(webbrowser, TRUE);
+ test_ClientSite(webbrowser, &ClientSite, TRUE);
+ test_DoVerb(webbrowser);
+ test_Navigate2(webbrowser, file_url);
+ test_ClientSite(webbrowser, NULL, TRUE);
+
+ ref = IWebBrowser2_Release(webbrowser);
+ ok(ref == 0, "ref=%u, expected 0\n", ref);
+
+ if(file != INVALID_HANDLE_VALUE)
+ DeleteFileA(file_path);
+}
+
START_TEST(webbrowser)
{
OleInitialize(NULL);
@@ -3536,6 +3584,7 @@ START_TEST(webbrowser)
test_WebBrowser_slim_container();
trace("Testing WebBrowserV1...\n");
test_WebBrowserV1();
+ test_FileProtocol();
OleUninitialize();
}
More information about the wine-cvs
mailing list