Fix a crashing call to GURL::spec() in downloads_api.cc:DownloadItemToJSON()

The actual bug is DownloadItemImpl::GetOriginalUrl(): the front() of an empty vector is not a good GURL reference!

The sprinkling of GURL::is_valid() is just to make me feel better.

There is still the open question of what happened to the downloads_url_chain records, but that is less urgent than stopping the crashes.

BUG=190096

Review URL: https://codereview.chromium.org/12607011

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188602 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc
index 59cfbce7..3e56e27 100644
--- a/content/browser/download/download_item_impl.cc
+++ b/content/browser/download/download_item_impl.cc
@@ -484,8 +484,7 @@
 }
 
 const GURL& DownloadItemImpl::GetURL() const {
-  return url_chain_.empty() ?
-             GURL::EmptyGURL() : url_chain_.back();
+  return url_chain_.empty() ? GURL::EmptyGURL() : url_chain_.back();
 }
 
 const std::vector<GURL>& DownloadItemImpl::GetUrlChain() const {
@@ -493,7 +492,9 @@
 }
 
 const GURL& DownloadItemImpl::GetOriginalUrl() const {
-  return url_chain_.front();
+  // Be careful about taking the front() of possibly-empty vectors!
+  // http://crbug.com/190096
+  return url_chain_.empty() ? GURL::EmptyGURL() : url_chain_.front();
 }
 
 const GURL& DownloadItemImpl::GetReferrerUrl() const {
@@ -731,12 +732,12 @@
   if (!url_chain_.empty()) {
     std::vector<GURL>::const_iterator iter = url_chain_.begin();
     std::vector<GURL>::const_iterator last = url_chain_.end();
-    url_list = (*iter).spec();
+    url_list = (*iter).is_valid() ? (*iter).spec() : "<invalid>";
     ++iter;
     for ( ; verbose && (iter != last); ++iter) {
       url_list += " ->\n\t";
       const GURL& next_url = *iter;
-      url_list += next_url.spec();
+      url_list += next_url.is_valid() ? next_url.spec() : "<invalid>";
     }
   }
 
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index b24bd0a..c9fe58c 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -57,7 +57,8 @@
   scoped_ptr<net::URLRequest> request(
       params->resource_context()->GetRequestContext()->CreateRequest(
           params->url(), NULL));
-  request->set_referrer(params->referrer().url.spec());
+  if (params->referrer().url.is_valid())
+    request->set_referrer(params->referrer().url.spec());
   webkit_glue::ConfigureURLRequestForReferrerPolicy(
       request.get(), params->referrer().policy);
   request->set_load_flags(request->load_flags() | params->load_flags());