Thomas Mullaly : urlmon/tests: Added FeatureControl registry key tests.

Alexandre Julliard julliard at winehq.org
Mon Apr 11 13:29:30 CDT 2011


Module: wine
Branch: master
Commit: 985aebd59ed02cd8ed35d60a77c690d8fc6294fe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=985aebd59ed02cd8ed35d60a77c690d8fc6294fe

Author: Thomas Mullaly <tmullaly at codeweavers.com>
Date:   Thu Apr  7 12:35:28 2011 -0400

urlmon/tests: Added FeatureControl registry key tests.

---

 dlls/urlmon/tests/misc.c |  111 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/urlmon/urlmon.spec  |    1 +
 2 files changed, 112 insertions(+), 0 deletions(-)

diff --git a/dlls/urlmon/tests/misc.c b/dlls/urlmon/tests/misc.c
index 4811ab0..bc0f40b 100644
--- a/dlls/urlmon/tests/misc.c
+++ b/dlls/urlmon/tests/misc.c
@@ -77,6 +77,7 @@ static HRESULT (WINAPI *pUrlMkGetSessionOption)(DWORD, LPVOID, DWORD, DWORD *, D
 static HRESULT (WINAPI *pCompareSecurityIds)(BYTE*,DWORD,BYTE*,DWORD,DWORD);
 static HRESULT (WINAPI *pCoInternetIsFeatureEnabled)(INTERNETFEATURELIST,DWORD);
 static HRESULT (WINAPI *pCoInternetSetFeatureEnabled)(INTERNETFEATURELIST,DWORD,BOOL);
+static HRESULT (WINAPI *pIEInstallScope)(DWORD*);
 
 static void test_CreateFormatEnum(void)
 {
@@ -1476,6 +1477,114 @@ static void test_IsValidURL(void)
     IBindCtx_Release(bctx);
 }
 
+/* With older versions of IE (IE 7 and earlier), urlmon caches
+ * the FeatureControl values from the registry when it's loaded
+ * into memory. Newer versions of IE conditionally cache the
+ * the FeatureControl registry values (i.e. When a call to
+ * CoInternetIsFeatureEnabled and a corresponding CoInternetSetFeatureEnabled
+ * call hasn't already been made for the specified Feature). Because of
+ * this we skip these tests on IE 7 and earlier.
+ */
+static void test_internet_features_registry(void) {
+    HRESULT hres;
+    DWORD res;
+    char module[MAX_PATH];
+    char *name;
+    HKEY feature_control;
+    HKEY feature;
+    DWORD value;
+    BOOL delete_feature_key = TRUE;
+    BOOL delete_feature_control_key = FALSE;
+
+    static const char* szFeatureControlKey = "Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl";
+    static const char* szFeatureBehaviorsKey = "FEATURE_BEHAVIORS";
+    static const char* szFeatureZoneElevationKey = "FEATURE_ZONE_ELEVATION";
+
+    if(!pIEInstallScope) {
+        win_skip("Skipping internet feature registry tests, IE is too old...\n");
+        return;
+    }
+
+    res = GetModuleFileNameA(NULL, module, sizeof(module));
+    ok(res, "GetModuleFileName failed: %d\n", GetLastError());
+
+    name = strrchr(module, '\\')+1;
+
+    /* Some Windows machines don't have a FeatureControl key in HKCU. */
+    res = RegOpenKeyA(HKEY_CURRENT_USER, szFeatureControlKey, &feature_control);
+    if(res != ERROR_SUCCESS) {
+        res = RegCreateKeyA(HKEY_CURRENT_USER, szFeatureControlKey, &feature_control);
+        ok(res == ERROR_SUCCESS, "RegCreateKey failed: %d\n", res);
+        delete_feature_control_key = TRUE;
+    }
+
+    res = RegOpenKeyA(feature_control, szFeatureBehaviorsKey, &feature);
+    if(res == ERROR_SUCCESS)
+        /* FEATURE_BEHAVIORS already existed, so don't delete it when we're done. */
+        delete_feature_key = FALSE;
+    else {
+        res = RegCreateKeyA(feature_control, szFeatureBehaviorsKey, &feature);
+        ok(res == ERROR_SUCCESS, "RegCreateKey failed: %d\n", res);
+    }
+
+    value = 0;
+    res = RegSetValueExA(feature, name, 0, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
+    ok(res == ERROR_SUCCESS, "RegSetValueEx failed: %d\n", res);
+
+    hres = pCoInternetIsFeatureEnabled(FEATURE_BEHAVIORS, GET_FEATURE_FROM_PROCESS);
+    todo_wine
+    ok(hres == S_FALSE, "CoInternetIsFeatureEnabled returned %08x, expected S_FALSE\n", hres);
+
+    if(delete_feature_key) {
+        RegCloseKey(feature);
+        RegDeleteKeyA(feature_control, szFeatureBehaviorsKey);
+    } else {
+        RegDeleteValue(feature, name);
+        RegCloseKey(feature);
+    }
+
+    /* IE's feature control cached the value it got from the registry earlier. */
+    hres = pCoInternetIsFeatureEnabled(FEATURE_BEHAVIORS, GET_FEATURE_FROM_PROCESS);
+    todo_wine
+    ok(hres == S_FALSE, "CoInternetIsFeatureEnabled returned %08x, expected S_FALSE\n", hres);
+
+    /* Restore this feature back to its default value. */
+    hres = pCoInternetSetFeatureEnabled(FEATURE_BEHAVIORS, SET_FEATURE_ON_PROCESS, TRUE);
+    todo_wine
+    ok(hres == S_OK, "CoInternetSetFeatureEnabled failed: %08x\n", hres);
+
+    RegCloseKey(feature_control);
+    if(delete_feature_control_key)
+        RegDeleteKeyA(HKEY_CURRENT_USER, szFeatureControlKey);
+
+    res = RegOpenKeyA(HKEY_LOCAL_MACHINE, szFeatureControlKey, &feature_control);
+    ok(res == ERROR_SUCCESS, "RegOpenKey failed: %d\n", res);
+
+    res = RegOpenKeyA(feature_control, szFeatureZoneElevationKey, &feature);
+    ok(res == ERROR_SUCCESS, "RegOpenKey failed: %d\n", res);
+
+    value = 1;
+    res = RegSetValueExA(feature, "*", 0, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
+    ok(res == ERROR_SUCCESS, "RegSetValueEx failed: %d\n", res);
+
+    hres = pCoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, GET_FEATURE_FROM_PROCESS);
+    todo_wine
+    ok(hres == S_OK, "CoInternetIsFeatureEnabled returned %08x, expected S_OK\n", hres);
+
+    RegDeleteValueA(feature, "*");
+    RegCloseKey(feature);
+    RegCloseKey(feature_control);
+
+    /* Value is still cached from last time. */
+    hres = pCoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, GET_FEATURE_FROM_PROCESS);
+    todo_wine
+    ok(hres == S_OK, "CoInternetIsFeatureEnabled returned %08x, expected S_OK\n", hres);
+
+    hres = pCoInternetSetFeatureEnabled(FEATURE_ZONE_ELEVATION, SET_FEATURE_ON_PROCESS, FALSE);
+    todo_wine
+    ok(hres == S_OK, "CoInternetSetFeatureEnabled failed: %08x\n", hres);
+}
+
 static const struct {
     INTERNETFEATURELIST feature;
     DWORD               get_flags;
@@ -1592,6 +1701,7 @@ static void test_internet_features(void) {
         return;
     }
 
+    test_internet_features_registry();
     test_CoInternetIsFeatureEnabled();
     test_CoInternetSetFeatureEnabled();
 }
@@ -1614,6 +1724,7 @@ START_TEST(misc)
     pCompareSecurityIds = (void*) GetProcAddress(hurlmon, "CompareSecurityIds");
     pCoInternetIsFeatureEnabled = (void*) GetProcAddress(hurlmon, "CoInternetIsFeatureEnabled");
     pCoInternetSetFeatureEnabled = (void*) GetProcAddress(hurlmon, "CoInternetSetFeatureEnabled");
+    pIEInstallScope = (void*) GetProcAddress(hurlmon, "IEInstallScope");
 
     if (!pCoInternetCompareUrl || !pCoInternetGetSecurityUrl ||
         !pCoInternetGetSession || !pCoInternetParseUrl || !pCompareSecurityIds) {
diff --git a/dlls/urlmon/urlmon.spec b/dlls/urlmon/urlmon.spec
index a2081ed..58b3f33 100644
--- a/dlls/urlmon/urlmon.spec
+++ b/dlls/urlmon/urlmon.spec
@@ -58,6 +58,7 @@
 @ stdcall HlinkNavigateString(ptr wstr)
 @ stdcall HlinkSimpleNavigateToMoniker(ptr wstr wstr ptr ptr ptr long long)
 @ stdcall HlinkSimpleNavigateToString(wstr wstr wstr ptr ptr ptr long long)
+@ stub IEInstallScope
 @ stdcall IsAsyncMoniker(ptr)
 @ stdcall IsLoggingEnabledA(str)
 @ stdcall IsLoggingEnabledW(wstr)




More information about the wine-cvs mailing list