| Index: chrome/browser/download/chrome_download_manager_delegate.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/download/chrome_download_manager_delegate.cc	(revision 98485)
 | 
| +++ chrome/browser/download/chrome_download_manager_delegate.cc	(working copy)
 | 
| @@ -257,7 +257,8 @@
 | 
|  }
 | 
|  
 | 
|  void ChromeDownloadManagerDelegate::CheckDownloadUrlDone(
 | 
| -    int32 download_id, bool is_dangerous_url) {
 | 
| +    int32 download_id,
 | 
| +    bool is_dangerous_url) {
 | 
|    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
|  
 | 
|    DownloadItem* download =
 | 
| @@ -268,10 +269,8 @@
 | 
|    if (is_dangerous_url)
 | 
|      download->MarkUrlDangerous();
 | 
|  
 | 
| -  download_history_->CheckVisitedReferrerBefore(
 | 
| -      download_id,
 | 
| -      download->referrer_url(),
 | 
| -      NewCallback(this,
 | 
| +  download_history_->CheckVisitedReferrerBefore(download_id,
 | 
| +      download->referrer_url(), NewCallback(this,
 | 
|            &ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone));
 | 
|  }
 | 
|  
 | 
| @@ -474,25 +473,31 @@
 | 
|      bool visited_referrer_before) {
 | 
|    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
|  
 | 
| -  bool auto_open = ShouldOpenFileBasedOnExtension(state.suggested_path);
 | 
| -  download_util::DownloadDangerLevel danger_level =
 | 
| -      download_util::GetFileDangerLevel(state.suggested_path.BaseName());
 | 
| +  // Anything loaded directly from the address bar is OK.
 | 
| +  if (state.transition_type & PageTransition::FROM_ADDRESS_BAR)
 | 
| +    return false;
 | 
|  
 | 
| -  if (danger_level == download_util::Dangerous)
 | 
| -    return !(auto_open && state.has_user_gesture);
 | 
| -
 | 
| -  if (danger_level == download_util::AllowOnUserGesture &&
 | 
| -      (!state.has_user_gesture || !visited_referrer_before))
 | 
| -    return true;
 | 
| -
 | 
| +  // Extensions that are not from the gallery are considered dangerous.
 | 
|    if (IsExtensionDownload(&download)) {
 | 
| -    // Extensions that are not from the gallery are considered dangerous.
 | 
|      ExtensionService* service = profile_->GetExtensionService();
 | 
|      if (!service || !service->IsDownloadFromGallery(download.GetURL(),
 | 
|                                                      download.referrer_url()))
 | 
|        return true;
 | 
|    }
 | 
| -  return false;
 | 
| +
 | 
| +  // Anything the user has marked auto-open is OK if it's user-initiated.
 | 
| +  if (ShouldOpenFileBasedOnExtension(state.suggested_path) &&
 | 
| +      state.has_user_gesture)
 | 
| +    return false;
 | 
| +
 | 
| +  // "Allow on user gesture" is OK when we have a user gesture and the hosting
 | 
| +  // page has been visited before today.
 | 
| +  download_util::DownloadDangerLevel danger_level =
 | 
| +      download_util::GetFileDangerLevel(state.suggested_path.BaseName());
 | 
| +  if (danger_level == download_util::AllowOnUserGesture)
 | 
| +    return !state.has_user_gesture || !visited_referrer_before;
 | 
| +
 | 
| +  return danger_level == download_util::Dangerous;
 | 
|  }
 | 
|  
 | 
|  void ChromeDownloadManagerDelegate::OnItemAddedToPersistentStore(
 | 
| 
 |