Y:\chromium_org\src\chrome\android\java\src\org\chromium\chrome\browser\contextmenu\ChromeContextMenuPopulator.java
public booleanonItemSelected(ContextMenuHelper helper, ContextMenuParams params, int itemId){
……
} else if (itemId == R.id.contextmenu_save_image){
ContextMenuUma.record(params, ContextMenuUma.ACTION_SAVE_IMAGE);
if (mDelegate.startDownload(params.getSrcUrl(), false)) {
helper.startContextMenuDownload(
false,mDelegate.isDataReductionProxyEnabledForURL(params.getSrcUrl()));
}
} else if (itemId == R.id.contextmenu_save_video) {
ContextMenuUma.record(params, ContextMenuUma.ACTION_SAVE_VIDEO);
if (mDelegate.startDownload(params.getSrcUrl(), false)) {
helper.startContextMenuDownload(false,false);
}
} else if (itemId == R.id.contextmenu_save_link_as) {
ContextMenuUma.record(params, ContextMenuUma.ACTION_SAVE_LINK);
String url =params.getUnfilteredLinkUrl();
if (mDelegate.startDownload(url, true)) {
ContextMenuUma.recordSaveLinkTypes(url);
helper.startContextMenuDownload(true,false);
}
}
…..
}
Y:\chromium_org\src\chrome\android\java\src\org\chromium\chrome\browser\contextmenu\ContextMenuHelper.java
publicvoid startContextMenuDownload(boolean isLink,boolean isDataReductionProxyEnabled) {
privatenative void nativeOnStartDownload(
long nativeContextMenuHelper,boolean isLink, boolean isDataReductionProxyEnabled);
X:\SmartGit_trunk_2.0\chromium_2125\android_packages_apps_Browser_chromium\src\chrome\browser\ui\android\context_menu_helper.cc
voidContextMenuHelper::OnStartDownload(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
jboolean jis_link,
jboolean jis_data_reduction_proxy_enabled)
Y:\chromium_org\src\chrome\browser\android\download\download_controller.cc
voidDownloadController::StartContextMenuDownload(
const ContextMenuParams& params,WebContents* web_contents, bool is_link,
const std::string& extra_headers)
void CreateContextMenuDownload(int render_process_id,
intrender_view_id,
constcontent::ContextMenuParams& params,
bool is_link,
conststd::string& extra_headers,
bool granted)
{
……
if (!is_link &&extra_headers.empty())
dl_params->set_prefer_cache(true);
dl_params->set_prompt(false);
dlm->DownloadUrl(std::move(dl_params));
……
}
/chromium_new/src/content/browser/download/download_manager_impl.cc
voidDownloadManagerImpl::DownloadUrl(
std::unique_ptr<DownloadUrlParameters> params){
……
BrowserThread::PostTaskAndReplyWithResult(
BrowserThread::IO,FROM_HERE,
base::Bind(&BeginDownload, base::Passed(¶ms),
browser_context_->GetResourceContext(),
content::DownloadItem::kInvalidId, weak_factory_.GetWeakPtr()),
base::Bind(&DownloadManagerImpl::AddUrlDownloader,
weak_factory_.GetWeakPtr()));
……
}
std::unique_ptr<UrlDownloader,BrowserThread::DeleteOnIOThread> BeginDownload(
std::unique_ptr<DownloadUrlParameters>params,
content::ResourceContext* resource_context,
uint32_t download_id,
base::WeakPtr<DownloadManagerImpl> download_manager){
/chromium_new/src/content/browser/loader/resource_dispatcher_host_impl.cc
DownloadInterruptReasonResourceDispatcherHostImpl::BeginDownload(
std::unique_ptr<net::URLRequest>request,
const Referrer& referrer,
bool is_content_initiated,
ResourceContext* context,
int render_process_id,
int render_view_route_id,
int render_frame_route_id,
bool do_not_prompt_for_login)
ResourceDispatcherHostImpl::CreateResourceHandlerForDownload(
net::URLRequest* request,
bool is_content_initiated,
bool must_download)
voidResourceDispatcherHostImpl::BeginRequestInternal(
std::unique_ptr<net::URLRequest>request,
std::unique_ptr<ResourceHandler> handler)
//
/chromium_2125_2.0/src/content/browser/download/download_resource_handler.cc
boolDownloadResourceHandler::OnResponseStarted(
ResourceResponse* response,
bool* defer)
staticvoid StartOnUIThread(
scoped_ptr<DownloadCreateInfo> info,
DownloadResourceHandler::DownloadTabInfo*tab_info,
scoped_ptr<ByteStreamReader> stream,
const DownloadUrlParameters::OnStartedCallback& started_cb)
/chromium_2125_2.0/src/content/browser/download/download_manager_impl.cc
voidDownloadManagerImpl::StartDownload(
scoped_ptr<DownloadCreateInfo> info,
scoped_ptr<ByteStreamReader> stream,
const DownloadUrlParameters::OnStartedCallback& on_started)
voidDownloadManagerImpl::StartDownloadWithId(
scoped_ptr<DownloadCreateInfo> info,
scoped_ptr<ByteStreamReader> stream,
constDownloadUrlParameters::OnStartedCallback& on_started,
bool new_download,
uint32 id){
……
base::FilePath default_download_directory;
if (delegate_) {
base::FilePath website_save_directory; // Unused
bool skip_dir_check = false; // Unused
delegate_->GetSaveDir(GetBrowserContext(),&website_save_directory,
&default_download_directory,&skip_dir_check);
}
……
download->Start(download_file.Pass(),req_handle.Pass());
……
}
/chromium_2125_2.0/src/content/browser/download/download_item_impl.cc
voidDownloadItemImpl::Start(
scoped_ptr<DownloadFile> file,
scoped_ptr<DownloadRequestHandleInterface> req_handle)
void DownloadItemImpl::OnDownloadFileInitialized(
DownloadInterruptReason result)
voidDownloadItemImpl::OnDownloadTargetDetermined(
const base::FilePath& target_path,
TargetDisposition disposition,
DownloadDangerType danger_type,
const base::FilePath& intermediate_path)
voidDownloadItemImpl::OnDownloadRenamedToIntermediateName(
DownloadInterruptReason reason,
const base::FilePath& full_path)
delegate上层需要设置
/chromium_2125_2.0/src/chrome/browser/download/
chrome_download_manager_delegate.cc