# Revert bug 1045209 to allow using absolute path

diff --git content/media/gmp/GMPChild.cpp content/media/gmp/GMPChild.cpp
index 4165a75..81914d5 100644
--- content/media/gmp/GMPChild.cpp
+++ content/media/gmp/GMPChild.cpp
@@ -66,19 +66,11 @@
   }
 #endif
 
-  nsCOMPtr<nsIFile> parent;
-  rv = aLibFile->GetParent(getter_AddRefs(parent));
-  if (NS_FAILED(rv)) {
-    return false;
-  }
-
-  nsAutoString parentLeafName;
-  rv = parent->GetLeafName(parentLeafName);
-  if (NS_FAILED(rv)) {
+  nsAutoString leafName;
+  if (NS_FAILED(aLibFile->GetLeafName(leafName))) {
     return false;
   }
-
-  nsAutoString baseName(Substring(parentLeafName, 4, parentLeafName.Length() - 1));
+  nsAutoString baseName(Substring(leafName, 4, leafName.Length() - 1));
 
 #if defined(XP_MACOSX)
   nsAutoString binaryName = NS_LITERAL_STRING("lib") + baseName + NS_LITERAL_STRING(".dylib");
diff --git content/media/gmp/GMPParent.cpp content/media/gmp/GMPParent.cpp
index e63453e..bf83b30 100644
--- content/media/gmp/GMPParent.cpp
+++ content/media/gmp/GMPParent.cpp
@@ -87,23 +87,16 @@
   mService = aService;
   mDirectory = aPluginDir;
 
-  // aPluginDir is <profile-dir>/<gmp-plugin-id>/<version>
-  // where <gmp-plugin-id> should be gmp-gmpopenh264
-  nsCOMPtr<nsIFile> parent;
-  nsresult rv = aPluginDir->GetParent(getter_AddRefs(parent));
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  nsAutoString parentLeafName;
-  rv = parent->GetLeafName(parentLeafName);
+  nsAutoString leafname;
+  nsresult rv = aPluginDir->GetLeafName(leafname);
   if (NS_FAILED(rv)) {
     return rv;
   }
   LOGD(("%s::%s: %p for %s", __CLASS__, __FUNCTION__, this, 
-       NS_LossyConvertUTF16toASCII(parentLeafName).get()));
+       NS_LossyConvertUTF16toASCII(leafname).get()));
 
-  MOZ_ASSERT(parentLeafName.Length() > 4);
-  mName = Substring(parentLeafName, 4);
+  MOZ_ASSERT(leafname.Length() > 4);
+  mName = Substring(leafname, 4);
 
   return ReadGMPMetaData();
 }
diff --git toolkit/modules/GMPInstallManager.jsm toolkit/modules/GMPInstallManager.jsm
index 9593492..470384b 100644
--- toolkit/modules/GMPInstallManager.jsm
+++ toolkit/modules/GMPInstallManager.jsm
@@ -107,6 +107,7 @@
    */
   KEY_LOG_ENABLED: "media.gmp-manager.log",
   KEY_ADDON_LAST_UPDATE: "media.{0}.lastUpdate",
+  KEY_ADDON_PATH: "media.{0}.path",
   KEY_ADDON_VERSION: "media.{0}.version",
   KEY_ADDON_AUTOUPDATE: "media.{0}.autoupdate",
   KEY_URL: "media.gmp-manager.url",
@@ -888,9 +889,7 @@
       let gmpAddon = this._gmpAddon;
       let installToDirPath = Cc["@mozilla.org/file/local;1"].
                           createInstance(Ci.nsIFile);
-      let path = OS.Path.join(OS.Constants.Path.profileDir,
-                              gmpAddon.id,
-                              gmpAddon.version);
+      let path = OS.Path.join(OS.Constants.Path.profileDir, gmpAddon.id);
       installToDirPath.initWithPath(path);
       log.info("install to directory path: " + installToDirPath.path);
       let gmpInstaller = new GMPExtractor(zipPath, installToDirPath.path);
@@ -899,10 +898,12 @@
         // Success, set the prefs
         let now = Math.round(Date.now() / 1000);
         GMPPrefs.set(GMPPrefs.KEY_ADDON_LAST_UPDATE, now, gmpAddon.id);
-        // Setting the version pref signals installation completion to consumers,
-        // if you need to set other prefs etc. do it before this.
+        // Setting the path pref signals installation completion to consumers,
+        // so set the version and potential other information they use first.
         GMPPrefs.set(GMPPrefs.KEY_ADDON_VERSION, gmpAddon.version,
                      gmpAddon.id);
+        GMPPrefs.set(GMPPrefs.KEY_ADDON_PATH,
+                     installToDirPath.path, gmpAddon.id);
         this._deferred.resolve(extractedPaths);
       }, err => {
         this._deferred.reject(err);
diff --git toolkit/mozapps/extensions/internal/OpenH264Provider.jsm toolkit/mozapps/extensions/internal/OpenH264Provider.jsm
index 1f3a0b1..93517be 100644
--- toolkit/mozapps/extensions/internal/OpenH264Provider.jsm
+++ toolkit/mozapps/extensions/internal/OpenH264Provider.jsm
@@ -29,6 +29,7 @@
 const OPENH264_PLUGIN_ID       = "gmp-gmpopenh264";
 const OPENH264_PREF_BRANCH     = "media." + OPENH264_PLUGIN_ID + ".";
 const OPENH264_PREF_ENABLED    = "enabled";
+const OPENH264_PREF_PATH       = "path";
 const OPENH264_PREF_VERSION    = "version";
 const OPENH264_PREF_LASTUPDATE = "lastUpdate";
 const OPENH264_PREF_AUTOUPDATE = "autoupdate";
@@ -93,7 +94,12 @@
 
   get description() { return pluginsBundle.GetStringFromName("openH264_description"); },
 
-  get version() { return prefs.get(OPENH264_PREF_VERSION, ""); },
+  get version() {
+    if (this.isInstalled) {
+      return prefs.get(OPENH264_PREF_VERSION, "");
+    }
+    return "";
+  },
 
   get isActive() { return !this.userDisabled; },
   get appDisabled() { return false; },
@@ -217,24 +223,17 @@
 
   get pluginMimeTypes() { return []; },
   get pluginLibraries() {
-    if (this.isInstalled) {
-      let path = this.version;
-      return [path];
-    }
-    return [];
+    let path = prefs.get(OPENH264_PREF_PATH, null);
+    return path && path.length ? [OS.Path.basename(path)] : [];
   },
   get pluginFullpath() {
-    if (this.isInstalled) {
-      let path = OS.Path.join(OS.Constants.Path.profileDir,
-                              OPENH264_PLUGIN_ID,
-                              this.version);
-      return [path];
-    }
-    return [];
+    let path = prefs.get(OPENH264_PREF_PATH, null);
+    return path && path.length ? [path] : [];
   },
 
   get isInstalled() {
-    return this.version.length > 0;
+    let path = prefs.get(OPENH264_PREF_PATH, "");
+    return path.length > 0;
   },
 };
 
@@ -245,19 +244,14 @@
                                                           "OpenH264Provider" + "::");
     OpenH264Wrapper._log = Log.repository.getLoggerWithMessagePrefix("Toolkit.OpenH264Provider",
                                                                      "OpenH264Wrapper" + "::");
-    this.gmpPath = null;
-    if (OpenH264Wrapper.isInstalled) {
-      this.gmpPath = OS.Path.join(OS.Constants.Path.profileDir,
-                                  OPENH264_PLUGIN_ID,
-                                  prefs.get(OPENH264_PREF_VERSION, null));
-    }
+    this.gmpPath = prefs.get(OPENH264_PREF_PATH, null);
     let enabled = prefs.get(OPENH264_PREF_ENABLED, true);
     this._log.trace("startup() - enabled=" + enabled + ", gmpPath="+this.gmpPath);
 
 
     Services.obs.addObserver(this, AddonManager.OPTIONS_NOTIFICATION_DISPLAYED, false);
     prefs.observe(OPENH264_PREF_ENABLED, this.onPrefEnabledChanged, this);
-    prefs.observe(OPENH264_PREF_VERSION, this.onPrefVersionChanged, this);
+    prefs.observe(OPENH264_PREF_PATH, this.onPrefPathChanged, this);
     prefs.observe(OPENH264_PREF_LOGGING, configureLogging);
 
     if (this.gmpPath && enabled) {
@@ -270,7 +264,7 @@
     this._log.trace("shutdown()");
     Services.obs.removeObserver(this, AddonManager.OPTIONS_NOTIFICATION_DISPLAYED);
     prefs.ignore(OPENH264_PREF_ENABLED, this.onPrefEnabledChanged, this);
-    prefs.ignore(OPENH264_PREF_VERSION, this.onPrefVersionChanged, this);
+    prefs.ignore(OPENH264_PREF_PATH, this.onPrefPathChanged, this);
     prefs.ignore(OPENH264_PREF_LOGGING, configureLogging);
 
     return OpenH264Wrapper._updateTask;
@@ -296,25 +290,20 @@
                                            wrapper);
   },
 
-  onPrefVersionChanged: function() {
+  onPrefPathChanged: function() {
     let wrapper = OpenH264Wrapper;
 
     AddonManagerPrivate.callAddonListeners("onUninstalling", wrapper, false);
     if (this.gmpPath) {
-      this._log.info("onPrefVersionChanged() - unregistering gmp directory " + this.gmpPath);
+      this._log.info("onPrefPathChanged() - removing gmp directory " + this.gmpPath);
       gmpService.removePluginDirectory(this.gmpPath);
     }
     AddonManagerPrivate.callAddonListeners("onUninstalled", wrapper);
 
     AddonManagerPrivate.callInstallListeners("onExternalInstall", null, wrapper, null, false);
-    this.gmpPath = null;
-    if (OpenH264Wrapper.isInstalled) {
-      this.gmpPath = OS.Path.join(OS.Constants.Path.profileDir,
-                                  OPENH264_PLUGIN_ID,
-                                  prefs.get(OPENH264_PREF_VERSION, null));
-    }
+    this.gmpPath = prefs.get(OPENH264_PREF_PATH, null);
     if (this.gmpPath && wrapper.isActive) {
-      this._log.info("onPrefVersionChanged() - registering gmp directory " + this.gmpPath);
+      this._log.info("onPrefPathChanged() - adding gmp directory " + this.gmpPath);
       gmpService.addPluginDirectory(this.gmpPath);
     }
     AddonManagerPrivate.callAddonListeners("onInstalled", wrapper);
