Implementation of single-module-per-logon-session-per-profile implementation for Chrome Frame.

BUG=61383
TEST=Run IE with version X of CF loaded. Register version Y of CF. Run a second IE process, notice that version Y when loaded defers to version X.


Review URL: http://codereview.chromium.org/4144008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65236 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome_frame/chrome_tab.cc b/chrome_frame/chrome_tab.cc
index b81be69..c31e8ece 100644
--- a/chrome_frame/chrome_tab.cc
+++ b/chrome_frame/chrome_tab.cc
@@ -212,26 +212,25 @@
     logging::InitLogging(NULL, logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG,
                         logging::LOCK_LOG_FILE, logging::DELETE_OLD_LOG_FILE);
 
-    if (!DllRedirector::RegisterAsFirstCFModule()) {
-      // We are not the first ones in, get the module who registered first.
-      HMODULE original_module = DllRedirector::GetFirstCFModule();
-      DCHECK(original_module != NULL)
-          << "Could not get first CF module handle.";
-      HMODULE this_module = reinterpret_cast<HMODULE>(&__ImageBase);
-      if (original_module != this_module) {
-        // Someone else was here first, try and get a pointer to their
-        // DllGetClassObject export:
-        g_dll_get_class_object_redir_ptr =
-            DllRedirector::GetDllGetClassObjectPtr(original_module);
-        DCHECK(g_dll_get_class_object_redir_ptr != NULL)
-            << "Found CF module with no DllGetClassObject export.";
-      }
+    DllRedirector* dll_redirector = Singleton<DllRedirector>::get();
+    DCHECK(dll_redirector);
+
+    if (!dll_redirector->RegisterAsFirstCFModule()) {
+      // Someone else was here first, try and get a pointer to their
+      // DllGetClassObject export:
+      g_dll_get_class_object_redir_ptr =
+          dll_redirector->GetDllGetClassObjectPtr();
+      DCHECK(g_dll_get_class_object_redir_ptr != NULL)
+          << "Found CF module with no DllGetClassObject export.";
     }
 
     // Enable ETW logging.
     logging::LogEventProvider::Initialize(kChromeFrameProvider);
   } else if (reason == DLL_PROCESS_DETACH) {
-    DllRedirector::UnregisterAsFirstCFModule();
+    DllRedirector* dll_redirector = Singleton<DllRedirector>::get();
+    DCHECK(dll_redirector);
+
+    dll_redirector->UnregisterAsFirstCFModule();
     g_patch_helper.UnpatchIfNeeded();
     delete g_exit_manager;
     g_exit_manager = NULL;