Skip to content

Commit

Permalink
Save image should download the original image when Data
Browse files Browse the repository at this point in the history
Saver is enabled.

The download manager should not use the cached image and
should bypass Data Saver.

BUG=499941

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

Cr-Commit-Position: refs/heads/master@{#335747}
  • Loading branch information
megjablon authored and Commit bot committed Jun 23, 2015
1 parent d5ba6b4 commit 3d5616a
Show file tree
Hide file tree
Showing 11 changed files with 58 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ public interface ChromeContextMenuItemDelegate {
*/
boolean canLoadOriginalImage();

/**
* Returns whether or not the Data Reduction Proxy is enabled for input url.
* @param url Input url to check for the Data Reduction Proxy setting.
* @return true if the Data Reduction Proxy is enabled for the url.
*/
boolean isDataReductionProxyEnabledForURL(String url);

/**
* Called when the context menu is trying to start a download.
* @param url Url of the download item.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,14 +164,18 @@ public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams params
mDelegate.onSaveToClipboard(MailTo.parse(params.getLinkUrl()).getTo(), false);
} else if (itemId == R.id.contextmenu_copy_link_text) {
mDelegate.onSaveToClipboard(params.getLinkText(), false);
} else if (itemId == R.id.contextmenu_save_image
|| itemId == R.id.contextmenu_save_video) {
} else if (itemId == R.id.contextmenu_save_image) {
if (mDelegate.startDownload(params.getSrcUrl(), false)) {
helper.startContextMenuDownload(false);
helper.startContextMenuDownload(
false, mDelegate.isDataReductionProxyEnabledForURL(params.getSrcUrl()));
}
} else if (itemId == R.id.contextmenu_save_video) {
if (mDelegate.startDownload(params.getSrcUrl(), false)) {
helper.startContextMenuDownload(false, false);
}
} else if (itemId == R.id.contextmenu_save_link_as) {
if (mDelegate.startDownload(params.getUnfilteredLinkUrl(), true)) {
helper.startContextMenuDownload(true);
helper.startContextMenuDownload(true, false);
}
} else if (itemId == R.id.contextmenu_search_by_image) {
mDelegate.onSearchByImageInNewTab();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* A helper class that handles generating context menus for {@link ContentViewCore}s.
*/
public class ContextMenuHelper implements OnCreateContextMenuListener, OnMenuItemClickListener {
private static final String DATA_REDUCTION_PROXY_PASSTHROUGH_HEADER =
"Chrome-Proxy: pass-through\r\n";

private long mNativeContextMenuHelper;

private ContextMenuPopulator mPopulator;
Expand Down Expand Up @@ -75,8 +78,11 @@ private void showContextMenu(ContentViewCore contentViewCore, ContextMenuParams
* Starts a download based on the current {@link ContextMenuParams}.
* @param isLink Whether or not the download target is a link.
*/
public void startContextMenuDownload(boolean isLink) {
if (mNativeContextMenuHelper != 0) nativeOnStartDownload(mNativeContextMenuHelper, isLink);
public void startContextMenuDownload(boolean isLink, boolean isDataReductionProxyEnabled) {
if (mNativeContextMenuHelper != 0) {
nativeOnStartDownload(mNativeContextMenuHelper, isLink,
isDataReductionProxyEnabled ? DATA_REDUCTION_PROXY_PASSTHROUGH_HEADER : null);
}
}

@Override
Expand Down Expand Up @@ -108,5 +114,6 @@ private boolean shouldShowMenu(ContextMenuParams params) {
return (mPopulator != null && mPopulator.shouldShowContextMenu(params));
}

private native void nativeOnStartDownload(long nativeContextMenuHelper, boolean isLink);
private native void nativeOnStartDownload(
long nativeContextMenuHelper, boolean isLink, String headers);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ public boolean canLoadOriginalImage() {
return false;
}

@Override
public boolean isDataReductionProxyEnabledForURL(String url) {
return false;
}

@Override
public boolean startDownload(String url, boolean isLink) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,11 @@ public boolean canLoadOriginalImage() {
return mUsedSpdyProxy && !mUsedSpdyProxyWithPassthrough;
}

@Override
public boolean isDataReductionProxyEnabledForURL(String url) {
return isSpdyProxyEnabledForUrl(url);
}

@Override
public boolean startDownload(String url, boolean isLink) {
if (isLink && shouldInterceptContextMenuDownload(url)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,11 @@ public boolean canLoadOriginalImage() {
return mUsedSpdyProxy && !mUsedSpdyProxyWithPassthrough;
}

@Override
public boolean isDataReductionProxyEnabledForURL(String url) {
return isSpdyProxyEnabledForUrl(url);
}

@Override
public boolean startDownload(String url, boolean isLink) {
if (isLink) {
Expand Down
8 changes: 6 additions & 2 deletions chrome/browser/ui/android/context_menu_helper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include "jni/ContextMenuParams_jni.h"
#include "ui/gfx/geometry/point.h"

using base::android::ConvertJavaStringToUTF8;
using base::android::ConvertUTF8ToJavaString;
using base::android::ConvertUTF16ToJavaString;
using base::android::ScopedJavaLocalRef;
Expand Down Expand Up @@ -96,11 +97,14 @@ ContextMenuHelper::CreateJavaContextMenuParams(

void ContextMenuHelper::OnStartDownload(JNIEnv* env,
jobject obj,
jboolean jis_link) {
jboolean jis_link,
jstring jheaders) {
std::string headers(ConvertJavaStringToUTF8(env, jheaders));
content::DownloadControllerAndroid::Get()->StartContextMenuDownload(
context_menu_params_,
web_contents_,
jis_link);
jis_link,
headers);
}

bool RegisterContextMenuHelper(JNIEnv* env) {
Expand Down
3 changes: 2 additions & 1 deletion chrome/browser/ui/android/context_menu_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ class ContextMenuHelper
void SetPopulator(jobject jpopulator);

// Methods called from Java via JNI ------------------------------------------
void OnStartDownload(JNIEnv* env, jobject obj, jboolean jis_link);
void OnStartDownload(
JNIEnv* env, jobject obj, jboolean jis_link, jstring jheaders);

private:
explicit ContextMenuHelper(content::WebContents* web_contents);
Expand Down
9 changes: 7 additions & 2 deletions content/browser/android/download_controller_android_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,8 @@ DownloadControllerAndroidImpl::JavaObject*
}

void DownloadControllerAndroidImpl::StartContextMenuDownload(
const ContextMenuParams& params, WebContents* web_contents, bool is_link) {
const ContextMenuParams& params, WebContents* web_contents, bool is_link,
const std::string& extra_headers) {
const GURL& url = is_link ? params.link_url : params.src_url;
const GURL& referring_url = params.frame_url.is_empty() ?
params.page_url : params.frame_url;
Expand All @@ -405,7 +406,11 @@ void DownloadControllerAndroidImpl::StartContextMenuDownload(
dl_params->set_referrer(referrer);
if (is_link)
dl_params->set_referrer_encoding(params.frame_charset);
else
net::HttpRequestHeaders headers;
headers.AddHeadersFromString(extra_headers);
for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext();)
dl_params->add_request_header(it.name(), it.value());
if (!is_link && extra_headers.empty())
dl_params->set_prefer_cache(true);
dl_params->set_prompt(false);
dlm->DownloadUrl(dl_params.Pass());
Expand Down
3 changes: 2 additions & 1 deletion content/browser/android/download_controller_android_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ class DownloadControllerAndroidImpl : public DownloadControllerAndroid,
void OnDownloadStarted(DownloadItem* download_item) override;
void StartContextMenuDownload(const ContextMenuParams& params,
WebContents* web_contents,
bool is_link) override;
bool is_link,
const std::string& extra_headers) override;
void DangerousDownloadValidated(WebContents* web_contents,
int download_id,
bool accept) override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class CONTENT_EXPORT DownloadControllerAndroid {
// Called when a download is initiated by context menu.
virtual void StartContextMenuDownload(
const ContextMenuParams& params, WebContents* web_contents,
bool is_link) = 0;
bool is_link, const std::string& extra_headers) = 0;

// Called when a dangerous download item is verified or rejected.
virtual void DangerousDownloadValidated(
Expand Down

0 comments on commit 3d5616a

Please sign in to comment.