Revved to chromium 2a04445358913b81ed786927172647b701b73113 refs/remotes/origin/HEAD
diff --git a/gurl_unittest.cc b/gurl_unittest.cc
index f38d7f9..3e94550 100644
--- a/gurl_unittest.cc
+++ b/gurl_unittest.cc
@@ -2,18 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 #include "url/url_canon.h"
 #include "url/url_test_utils.h"
 
-// Some implementations of base/basictypes.h may define ARRAYSIZE.
-// If it's not defined, we define it to the ARRAYSIZE_UNSAFE macro
-// which is in our version of basictypes.h.
-#ifndef ARRAYSIZE
-#define ARRAYSIZE ARRAYSIZE_UNSAFE
-#endif
-
 namespace url {
 
 using test_utils::WStringToUTF16;
@@ -232,7 +226,7 @@
     "http:path",
     "://google.com",
   };
-  for (size_t i = 0; i < ARRAYSIZE(valid_cases); i++) {
+  for (size_t i = 0; i < arraysize(valid_cases); i++) {
     EXPECT_TRUE(GURL(valid_cases[i]).is_valid())
         << "Case: " << valid_cases[i];
   }
@@ -244,7 +238,7 @@
     "http://google.com:12three45",
     "path",
   };
-  for (size_t i = 0; i < ARRAYSIZE(invalid_cases); i++) {
+  for (size_t i = 0; i < arraysize(invalid_cases); i++) {
     EXPECT_FALSE(GURL(invalid_cases[i]).is_valid())
         << "Case: " << invalid_cases[i];
   }
@@ -299,7 +293,7 @@
     {"filesystem:http://www.google.com/type/", "../foo.html", true, "filesystem:http://www.google.com/type/foo.html"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(resolve_cases); i++) {
+  for (size_t i = 0; i < arraysize(resolve_cases); i++) {
     // 8-bit code path.
     GURL input(resolve_cases[i].base);
     GURL output = input.Resolve(resolve_cases[i].relative);
@@ -331,7 +325,7 @@
     {"filesystem:http://www.google.com/temp/foo?q#b", "http://www.google.com/"},
     {"filesystem:http://user:pass@google.com:21/blah#baz", "http://google.com:21/"},
   };
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     GURL url(cases[i].input);
     GURL origin = url.GetOrigin();
     EXPECT_EQ(cases[i].expected, origin.spec());
@@ -350,7 +344,7 @@
     {"http://:@www.google.com", "http://www.google.com/"},
     {"http://www.google.com/temp/foo?q#b", "http://www.google.com/temp/foo?q"},
   };
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     GURL url(cases[i].input);
     GURL origin = url.GetAsReferrer();
     EXPECT_EQ(cases[i].expected, origin.spec());
@@ -369,7 +363,7 @@
     {"filesystem:file:///temporary/bar.html?baz=22", "filesystem:file:///temporary/"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     GURL url(cases[i].input);
     GURL empty_path = url.GetWithEmptyPath();
     EXPECT_EQ(cases[i].expected, empty_path.spec());
@@ -401,7 +395,7 @@
     {"filesystem:http://www.google.com/foo/bar.html?foo#bar", NULL, NULL, NULL, NULL, NULL, "/", "", "", "filesystem:http://www.google.com/foo/"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(replace_cases); i++) {
+  for (size_t i = 0; i < arraysize(replace_cases); i++) {
     const ReplaceCase& cur = replace_cases[i];
     GURL url(cur.base);
     GURL::Replacements repl;
@@ -458,7 +452,7 @@
     {"filesystem:http://www.google.com/temporary/foo/bar.html?query", "/foo/bar.html?query", "/temporary"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     GURL url(cases[i].input);
     std::string path_request = url.PathForRequest();
     EXPECT_EQ(cases[i].expected, path_request);
@@ -506,7 +500,7 @@
     {"filesystem:file:///t/foo", PORT_UNSPECIFIED},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(port_tests); i++) {
+  for (size_t i = 0; i < arraysize(port_tests); i++) {
     GURL url(port_tests[i].spec);
     EXPECT_EQ(port_tests[i].expected_int_port, url.EffectiveIntPort());
   }
@@ -527,7 +521,7 @@
     {"some random input!", false},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(ip_tests); i++) {
+  for (size_t i = 0; i < arraysize(ip_tests); i++) {
     GURL url(ip_tests[i].spec);
     EXPECT_EQ(ip_tests[i].expected_ip, url.HostIsIPAddress());
   }
@@ -552,7 +546,7 @@
     {"http://]/", "]", "]"},
     {"", "", ""},
   };
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     GURL url(cases[i].input);
     EXPECT_EQ(cases[i].expected_host, url.host());
     EXPECT_EQ(cases[i].expected_plainhost, url.HostNoBrackets());
diff --git a/third_party/mozilla/url_parse.cc b/third_party/mozilla/url_parse.cc
index 6256796..ba842b8 100644
--- a/third_party/mozilla/url_parse.cc
+++ b/third_party/mozilla/url_parse.cc
@@ -621,23 +621,13 @@
     return;
   }
 
-  // Search backwards for a parameter, which is a normally unused field in a
-  // URL delimited by a semicolon. We parse the parameter as part of the
-  // path, but here, we don't want to count it. The last semicolon is the
-  // parameter. The path should start with a slash, so we don't need to check
-  // the first one.
+  // Extract the filename range from the path which is between
+  // the last slash and the following semicolon.
   int file_end = path.end();
-  for (int i = path.end() - 1; i > path.begin; i--) {
+  for (int i = path.end() - 1; i >= path.begin; i--) {
     if (spec[i] == ';') {
       file_end = i;
-      break;
-    }
-  }
-
-  // Now search backwards from the filename end to the previous slash
-  // to find the beginning of the filename.
-  for (int i = file_end - 1; i >= path.begin; i--) {
-    if (IsURLSlash(spec[i])) {
+    } else if (IsURLSlash(spec[i])) {
       // File name is everything following this character to the end
       *file_name = MakeRange(i + 1, file_end);
       return;
diff --git a/url_canon_icu_unittest.cc b/url_canon_icu_unittest.cc
index b28c30a..12b7ded 100644
--- a/url_canon_icu_unittest.cc
+++ b/url_canon_icu_unittest.cc
@@ -10,13 +10,6 @@
 #include "url/url_canon_stdstring.h"
 #include "url/url_test_utils.h"
 
-// Some implementations of base/basictypes.h may define ARRAYSIZE.
-// If it's not defined, we define it to the ARRAYSIZE_UNSAFE macro
-// which is in our version of basictypes.h.
-#ifndef ARRAYSIZE
-#define ARRAYSIZE ARRAYSIZE_UNSAFE
-#endif
-
 namespace url {
 
 using test_utils::WStringToUTF16;
@@ -61,7 +54,7 @@
       "hello\xa7\x41%26%231758%3B\xa6\x6eworld"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(icu_cases); i++) {
+  for (size_t i = 0; i < arraysize(icu_cases); i++) {
     UConvScoper conv(icu_cases[i].encoding);
     ASSERT_TRUE(conv.converter() != NULL);
     ICUCharsetConverter converter(conv.converter());
@@ -118,7 +111,7 @@
       "?q=Chinese%26%2365319%3B"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(query_cases); i++) {
+  for (size_t i = 0; i < arraysize(query_cases); i++) {
     Component out_comp;
 
     UConvScoper conv(query_cases[i].encoding);
diff --git a/url_canon_unittest.cc b/url_canon_unittest.cc
index 469e8a0..3ab8710 100644
--- a/url_canon_unittest.cc
+++ b/url_canon_unittest.cc
@@ -12,13 +12,6 @@
 #include "url/url_parse.h"
 #include "url/url_test_utils.h"
 
-// Some implementations of base/basictypes.h may define ARRAYSIZE.
-// If it's not defined, we define it to the ARRAYSIZE_UNSAFE macro
-// which is in our version of basictypes.h.
-#ifndef ARRAYSIZE
-#define ARRAYSIZE ARRAYSIZE_UNSAFE
-#endif
-
 namespace url {
 
 using test_utils::WStringToUTF16;
@@ -123,7 +116,7 @@
     {0x10FFFF, "\xF4\x8F\xBF\xBF"},
   };
   std::string out_str;
-  for (size_t i = 0; i < ARRAYSIZE(utf_cases); i++) {
+  for (size_t i = 0; i < arraysize(utf_cases); i++) {
     out_str.clear();
     StdStringCanonOutput output(&out_str);
     AppendUTF8Value(utf_cases[i].input, &output);
@@ -182,7 +175,7 @@
   };
 
   std::string out_str;
-  for (size_t i = 0; i < ARRAYSIZE(utf_cases); i++) {
+  for (size_t i = 0; i < arraysize(utf_cases); i++) {
     if (utf_cases[i].input8) {
       out_str.clear();
       StdStringCanonOutput output(&out_str);
@@ -899,7 +892,7 @@
     {"ftp://me\\mydomain:pass@foo.com/", "", Component(0, -1), Component(0, -1), true},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(user_info_cases); i++) {
+  for (size_t i = 0; i < arraysize(user_info_cases); i++) {
     int url_len = static_cast<int>(strlen(user_info_cases[i].input));
     Parsed parsed;
     ParseStandardURL(user_info_cases[i].input, url_len, &parsed);
@@ -968,7 +961,7 @@
     {"80", PORT_UNSPECIFIED, ":80", Component(1, 2), true},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(port_cases); i++) {
+  for (size_t i = 0; i < arraysize(port_cases); i++) {
     int url_len = static_cast<int>(strlen(port_cases[i].input));
     Component in_comp(0, url_len);
     Component out_comp;
@@ -1152,7 +1145,7 @@
     {"q=\"asdf\"", L"q=\"asdf\"", "?q=%22asdf%22"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(query_cases); i++) {
+  for (size_t i = 0; i < arraysize(query_cases); i++) {
     Component out_comp;
 
     if (query_cases[i].input8) {
@@ -1309,7 +1302,7 @@
     {"wss://foo:815/", "wss://foo:815/", true},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     int url_len = static_cast<int>(strlen(cases[i].input));
     Parsed parsed;
     ParseStandardURL(cases[i].input, url_len, &parsed);
@@ -1648,7 +1641,7 @@
 #endif  // _WIN32
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     int url_len = static_cast<int>(strlen(cases[i].input));
     Parsed parsed;
     ParseFileURL(cases[i].input, url_len, &parsed);
@@ -1691,7 +1684,7 @@
     {"filesystem:File:///temporary/Bob?qUery#reF", "filesystem:file:///temporary/Bob?qUery#reF", true},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     int url_len = static_cast<int>(strlen(cases[i].input));
     Parsed parsed;
     ParseFileSystemURL(cases[i].input, url_len, &parsed);
@@ -1726,7 +1719,7 @@
     {":\":This /is interesting;?#", ":\":This /is interesting;?#"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(path_cases); i++) {
+  for (size_t i = 0; i < arraysize(path_cases); i++) {
     int url_len = static_cast<int>(strlen(path_cases[i].input));
     Parsed parsed;
     ParsePathURL(path_cases[i].input, url_len, true, &parsed);
@@ -1780,7 +1773,7 @@
   Parsed parsed;
   Parsed out_parsed;
 
-  for (size_t i = 0; i < ARRAYSIZE(cases); i++) {
+  for (size_t i = 0; i < arraysize(cases); i++) {
     int url_len = static_cast<int>(strlen(cases[i].input));
     if (i == 8) {
       // The 9th test case purposely has a '\0' in it -- don't count it
@@ -2043,7 +2036,7 @@
     {"about:blank", false, false, "content://content.Provider/", true, false, true, ""},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(rel_cases); i++) {
+  for (size_t i = 0; i < arraysize(rel_cases); i++) {
     const RelativeCase& cur_case = rel_cases[i];
 
     Parsed parsed;
diff --git a/url_parse_unittest.cc b/url_parse_unittest.cc
index a8b7f85..71b2438 100644
--- a/url_parse_unittest.cc
+++ b/url_parse_unittest.cc
@@ -4,17 +4,10 @@
 
 #include "url/url_parse.h"
 
-#include "base/basictypes.h"
+#include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/url_parse.h"
 
-// Some implementations of base/basictypes.h may define ARRAYSIZE.
-// If it's not defined, we define it to the ARRAYSIZE_UNSAFE macro
-// which is in our version of basictypes.h.
-#ifndef ARRAYSIZE
-#define ARRAYSIZE ARRAYSIZE_UNSAFE
-#endif
-
 // Interesting IE file:isms...
 //
 //  file:/foo/bar              file:///foo/bar
@@ -201,7 +194,7 @@
     {"file:///c:/foo", Parsed::HOST, true, 7},
     {"file:///c:/foo", Parsed::PATH, true, 7},
   };
-  for (size_t i = 0; i < ARRAYSIZE(count_cases); i++) {
+  for (size_t i = 0; i < arraysize(count_cases); i++) {
     int length = static_cast<int>(strlen(count_cases[i].url));
 
     // Simple test to distinguish file and standard URLs.
@@ -505,11 +498,16 @@
     {"http://www.google.com/foo/bar.html#ref", "bar.html"},
     {"http://www.google.com/search/;param", ""},
     {"http://www.google.com/foo/bar.html;param#ref", "bar.html"},
-    {"http://www.google.com/foo/bar.html;foo;param#ref", "bar.html;foo"},
+    {"http://www.google.com/foo/bar.html;foo;param#ref", "bar.html"},
     {"http://www.google.com/foo/bar.html?query#ref", "bar.html"},
+    {"http://www.google.com/foo;/bar.html", "bar.html"},
+    {"http://www.google.com/foo;/", ""},
+    {"http://www.google.com/foo;", "foo"},
+    {"http://www.google.com/;", ""},
+    {"http://www.google.com/foo;bar;html", "foo"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE(file_cases); i++) {
+  for (size_t i = 0; i < arraysize(file_cases); i++) {
     const char* url = file_cases[i].input;
     int len = static_cast<int>(strlen(url));
 
diff --git a/url_util_unittest.cc b/url_util_unittest.cc
index f84b70d..ea4824f 100644
--- a/url_util_unittest.cc
+++ b/url_util_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/url_canon.h"
 #include "url/url_canon_stdstring.h"
@@ -159,7 +160,7 @@
     {"%e4%bd%a0%e5%a5%bd", "\xe4\xbd\xa0\xe5\xa5\xbd"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(decode_cases); i++) {
+  for (size_t i = 0; i < arraysize(decode_cases); i++) {
     const char* input = decode_cases[i].input;
     RawCanonOutputT<base::char16> output;
     DecodeURLEscapeSequences(input, strlen(input), &output);
@@ -209,7 +210,7 @@
      "pqrstuvwxyz%7B%7C%7D~%7F"},
   };
 
-  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(encode_cases); i++) {
+  for (size_t i = 0; i < arraysize(encode_cases); i++) {
     const char* input = encode_cases[i].input;
     RawCanonOutputT<char> buffer;
     EncodeURIComponent(input, strlen(input), &buffer);
@@ -274,7 +275,7 @@
       "javascript:alert('foo#badfrag" },
   };
 
-  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(resolve_non_standard_cases); i++) {
+  for (size_t i = 0; i < arraysize(resolve_non_standard_cases); i++) {
     const ResolveRelativeCase& test_data = resolve_non_standard_cases[i];
     Parsed base_parsed;
     ParsePathURL(test_data.base, strlen(test_data.base), false, &base_parsed);