| Index: chrome/browser/android/tab_android.cc | 
| diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc | 
| index 005669d1972a18eecc865d99ba76532548b442e1..be8f65565fa2de37f02a646de519bfc7ec4e2004 100644 | 
| --- a/chrome/browser/android/tab_android.cc | 
| +++ b/chrome/browser/android/tab_android.cc | 
| @@ -54,6 +54,8 @@ | 
| #include "components/bookmarks/managed/managed_bookmark_service.h" | 
| #include "components/dom_distiller/core/url_utils.h" | 
| #include "components/favicon/content/content_favicon_driver.h" | 
| +#include "components/feature_engagement_tracker/public/feature_constants.h" | 
| +#include "components/feature_engagement_tracker/public/feature_list.h" | 
| #include "components/navigation_interception/intercept_navigation_delegate.h" | 
| #include "components/navigation_interception/navigation_params.h" | 
| #include "components/sessions/content/content_live_tab.h" | 
| @@ -78,6 +80,7 @@ | 
| #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" | 
| #include "ui/android/view_android.h" | 
| #include "ui/android/window_android.h" | 
| +#include "ui/base/layout.h" | 
| #include "ui/base/resource/resource_bundle.h" | 
| #include "ui/base/window_open_disposition.h" | 
| #include "ui/display/display.h" | 
| @@ -380,6 +383,12 @@ void TabAndroid::InitWebContents( | 
| GetProfile()); | 
| } | 
| content_layer_->InsertChild(web_contents_->GetNativeView()->GetLayer(), 0); | 
| + | 
| +  if (base::FeatureList::IsEnabled( | 
| +          feature_engagement_tracker::kIPHMediaDownloadFeature)) { | 
| +    media_iph_manager_ = | 
| +        base::MakeUnique<MediaInProductHelpManager>(web_contents_.get(), this); | 
| +  } | 
| } | 
|  | 
| void TabAndroid::UpdateDelegates( | 
| @@ -434,6 +443,7 @@ void TabAndroid::DestroyWebContents(JNIEnv* env, | 
| if (process) | 
| process->FastShutdownForPageCount(1); | 
|  | 
| +    media_iph_manager_.reset(); | 
| web_contents_.reset(); | 
| synced_tab_delegate_->ResetWebContents(); | 
| } else { | 
| @@ -801,6 +811,40 @@ void TabAndroid::AttachToTabContentManager( | 
| tab_content_manager_->AttachLiveLayer(GetAndroidId(), GetContentLayer()); | 
| } | 
|  | 
| +void TabAndroid::ShowMediaDownloadInProductHelp( | 
| +    const gfx::Rect& rect_in_frame) { | 
| +  DCHECK(web_contents_); | 
| + | 
| +  // We need to account for the browser controls offset to get the location for | 
| +  // the widget in the view. | 
| +  gfx::Vector2dF content_offset = | 
| +      web_contents_->GetNativeView()->content_offset(); | 
| +  gfx::Rect rect_in_view(rect_in_frame.x() + content_offset.x(), | 
| +                         rect_in_frame.y() + content_offset.y(), | 
| +                         rect_in_frame.width(), rect_in_frame.height()); | 
| +  gfx::Rect rect_in_view_scaled = gfx::ScaleToEnclosingRectSafe( | 
| +      rect_in_view, | 
| +      ui::GetScaleFactorForNativeView(web_contents_->GetNativeView())); | 
| + | 
| +  JNIEnv* env = base::android::AttachCurrentThread(); | 
| +  Java_Tab_showMediaDownloadInProductHelp( | 
| +      env, weak_java_tab_.get(env), rect_in_view_scaled.x(), | 
| +      rect_in_view_scaled.y(), rect_in_view_scaled.width(), | 
| +      rect_in_view_scaled.height()); | 
| +} | 
| + | 
| +void TabAndroid::DismissMediaDownloadInProductHelp() { | 
| +  JNIEnv* env = base::android::AttachCurrentThread(); | 
| +  Java_Tab_hideMediaDownloadInProductHelp(env, weak_java_tab_.get(env)); | 
| +} | 
| + | 
| +void TabAndroid::DownloadMediaInProductHelpDismissed( | 
| +    JNIEnv* env, | 
| +    const base::android::JavaParamRef<jobject>& obj) { | 
| +  DCHECK(media_iph_manager_); | 
| +  media_iph_manager_->WidgetDismissed(); | 
| +} | 
| + | 
| scoped_refptr<content::DevToolsAgentHost> TabAndroid::GetDevToolsAgentHost() { | 
| return devtools_host_; | 
| } | 
|  |