From 5989fb92c1a3ba5913f17bff8b5b6e113c45c8bf Mon, 14 Nov 2011 18:53:38 +0100
From: Bram Goffings <bramgoffings@gmail.com>
Date: Mon, 14 Nov 2011 18:53:28 +0100
Subject: [PATCH] user path fix

diff --git a/core/includes/menu.inc b/core/includes/menu.inc
index 29a0a40..ad5dce5 100644
--- a/core/includes/menu.inc
+++ b/core/includes/menu.inc
@@ -455,6 +455,7 @@
       // checked for access.
       drupal_alter('menu_get_item', $router_item, $path, $original_map);
 
+      $router_item['original_href'] = $path;
       $map = _menu_translate($router_item, $original_map);
       $router_item['original_map'] = $original_map;
       if ($map === FALSE) {
@@ -2275,7 +2276,8 @@
  *   A Drupal path - not a path alias.
  */
 function menu_set_active_item($path) {
-  $_GET['q'] = $path;
+  // menu_set_item() inlined for speed.
+  menu_get_item(NULL, menu_get_item($path));
 }
 
 /**
@@ -2376,7 +2378,7 @@
  *   menu link ('node/5' if it exists, or fallback to 'node/%').
  *
  * @return
- *   A fully translated menu link, or NULL if no matching menu link was
+ *   A fully translated menu link, or FALSE if no matching menu link was
  *   found. The most specific menu link ('node/5' preferred over 'node/%') in
  *   the most preferred menu (as defined by menu_get_active_menu_names()) is
  *   returned.
@@ -2385,7 +2387,13 @@
   $preferred_links = &drupal_static(__FUNCTION__);
 
   if (!isset($path)) {
-    $path = drupal_get_context()->getValue('path:system');
+    if ($item = menu_get_item()) {
+      $path = $item['original_href'];
+    }
+    else {
+      // No router item, no preferred link. We are likely on a 404.
+      return FALSE;
+    }
   }
 
   if (!isset($preferred_links[$path])) {
@@ -2395,7 +2403,9 @@
     // which are ordered by priority (translated hrefs are preferred over
     // untranslated paths). Afterwards, the most relevant path is picked from
     // the menus, ordered by menu preference.
-    $item = menu_get_item($path);
+    if (!isset($item)) {
+      $item = menu_get_item($path);
+    }
     $path_candidates = array();
     // 1. The current item href.
     $path_candidates[$item['href']] = $item['href'];
