download_saveimage流程

本文详细解析了Chromium浏览器中从用户点击右键保存链接到完成文件下载的整个过程。涉及核心组件包括ContextMenuHelper、DownloadController及DownloadManagerImpl等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(&params),

                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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值