Cherry-pick: Don't use webmediaplayer to FullscreenController about fullscreen change

NOTE: this cherry-pick should only be submitted after
https://googleplex-android-review.git.corp.google.com/#/c/523935

BUG=17021433

---------------------------------------------------------------------

Don't use webmediaplayer to FullscreenController about fullscreen change

This is cloned from https://codereview.chromium.org/275163002/
The previous change will break webview because AwWebContentsDelegate::ToggleFullscreenModeForTab is not implemented.
This change passes a runtime switch to blink to disable fullscreen for non-media elements for android webview.
when AwWebContentsDelegate::ToggleFullscreenModeForTab is called, android webview will send a FullscreenChanged IPC to finish the will/DidEnterFullscreen event for the media element.

blink side CL: https://codereview.chromium.org/290643005/

This CL only impacts android webview

BUG=367346

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@281781 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java
index bdc5637..dbcf330 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java
@@ -35,6 +35,10 @@
     @CalledByNative
     public abstract void activateContents();
 
+    @Override
+    @CalledByNative
+    public abstract void toggleFullscreenModeForTab(boolean enterFullscreen);
+
     // Call in response to a prior runFileChooser call.
     protected static native void nativeFilesSelectedInChooser(int processId, int renderId,
             int mode_flags, String[] filePath);
diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java
index 2edef84..70a148b 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java
@@ -13,6 +13,7 @@
 import android.webkit.ValueCallback;
 
 import org.chromium.base.ThreadUtils;
+import org.chromium.content.browser.ContentVideoView;
 import org.chromium.content.browser.ContentViewCore;
 
 /**
@@ -191,4 +192,12 @@
     public void activateContents() {
         mContentsClient.onRequestFocus();
     }
+
+    @Override
+    public void toggleFullscreenModeForTab(boolean enterFullscreen) {
+        if (!enterFullscreen) {
+            ContentVideoView videoView = ContentVideoView.getContentVideoView();
+            if (videoView != null) videoView.exitFullscreen(false);
+        }
+    }
 }
diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc
index 19c6251..0ed0945 100644
--- a/android_webview/native/aw_settings.cc
+++ b/android_webview/native/aw_settings.cc
@@ -431,6 +431,8 @@
       Java_AwSettings_getAllowDisplayingInsecureContentLocked(env, obj);
   web_prefs->allow_running_insecure_content =
       Java_AwSettings_getAllowRunningInsecureContentLocked(env, obj);
+
+  web_prefs->disallow_fullscreen_for_non_media_elements = true;
 }
 
 static jlong Init(JNIEnv* env,
diff --git a/android_webview/native/aw_web_contents_delegate.cc b/android_webview/native/aw_web_contents_delegate.cc
index f9c42b1..ee51dc5 100644
--- a/android_webview/native/aw_web_contents_delegate.cc
+++ b/android_webview/native/aw_web_contents_delegate.cc
@@ -47,7 +47,8 @@
 AwWebContentsDelegate::AwWebContentsDelegate(
     JNIEnv* env,
     jobject obj)
-    : WebContentsDelegateAndroid(env, obj) {
+    : WebContentsDelegateAndroid(env, obj),
+      is_fullscreen_(false) {
 }
 
 AwWebContentsDelegate::~AwWebContentsDelegate() {
@@ -207,6 +208,25 @@
           new MediaAccessPermissionRequest(request, callback)));
 }
 
+void AwWebContentsDelegate::ToggleFullscreenModeForTab(
+    content::WebContents* web_contents, bool enter_fullscreen) {
+  JNIEnv* env = AttachCurrentThread();
+
+  ScopedJavaLocalRef<jobject> java_delegate = GetJavaDelegate(env);
+  if (java_delegate.obj()) {
+    Java_AwWebContentsDelegate_toggleFullscreenModeForTab(
+        env, java_delegate.obj(), enter_fullscreen);
+  }
+  is_fullscreen_ = enter_fullscreen;
+  web_contents->GetRenderViewHost()->WasResized();
+}
+
+bool AwWebContentsDelegate::IsFullscreenForTabOrPending(
+    const content::WebContents* web_contents) const {
+  return is_fullscreen_;
+}
+
+
 static void FilesSelectedInChooser(
     JNIEnv* env, jclass clazz,
     jint process_id, jint render_id, jint mode_flags,
diff --git a/android_webview/native/aw_web_contents_delegate.h b/android_webview/native/aw_web_contents_delegate.h
index 1954bc2..824c922 100644
--- a/android_webview/native/aw_web_contents_delegate.h
+++ b/android_webview/native/aw_web_contents_delegate.h
@@ -53,6 +53,13 @@
       content::WebContents* web_contents,
       const content::MediaStreamRequest& request,
       const content::MediaResponseCallback& callback) OVERRIDE;
+  virtual void ToggleFullscreenModeForTab(content::WebContents* web_contents,
+                                          bool enter_fullscreen) OVERRIDE;
+  virtual bool IsFullscreenForTabOrPending(
+      const content::WebContents* web_contents) const OVERRIDE;
+
+ private:
+  bool is_fullscreen_;
 };
 
 bool RegisterAwWebContentsDelegate(JNIEnv* env);
diff --git a/content/browser/media/android/browser_media_player_manager.cc b/content/browser/media/android/browser_media_player_manager.cc
index 5df9016..79b7983 100644
--- a/content/browser/media/android/browser_media_player_manager.cc
+++ b/content/browser/media/android/browser_media_player_manager.cc
@@ -164,10 +164,10 @@
 }
 
 void BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) {
+  if (WebContentsDelegate* delegate = web_contents_->GetDelegate())
+    delegate->ToggleFullscreenModeForTab(web_contents_, false);
   if (!CommandLine::ForCurrentProcess()->HasSwitch(
       switches::kDisableOverlayFullscreenVideoSubtitle)) {
-    if (WebContentsDelegate* delegate = web_contents_->GetDelegate())
-      delegate->ToggleFullscreenModeForTab(web_contents_, false);
     if (RenderWidgetHostViewAndroid* view_android =
         static_cast<RenderWidgetHostViewAndroid*>(
             web_contents_->GetRenderWidgetHostView())) {
@@ -215,8 +215,6 @@
           web_contents_->GetRenderWidgetHostView())) {
     view_android->SetOverlayVideoMode(true);
   }
-  if (WebContentsDelegate* delegate = web_contents_->GetDelegate())
-    delegate->ToggleFullscreenModeForTab(web_contents_, true);
 }
 
 void BrowserMediaPlayerManager::OnMediaMetadataChanged(
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc
index 9833546..253b37c 100644
--- a/content/renderer/media/android/webmediaplayer_android.cc
+++ b/content/renderer/media/android/webmediaplayer_android.cc
@@ -765,11 +765,8 @@
 }
 
 void WebMediaPlayerAndroid::OnDidEnterFullscreen() {
-  if (!player_manager_->IsInFullscreen(frame_)) {
-    frame_->view()->willEnterFullScreen();
-    frame_->view()->didEnterFullScreen();
+  if (!player_manager_->IsInFullscreen(frame_))
     player_manager_->DidEnterFullscreen(frame_);
-  }
 }
 
 void WebMediaPlayerAndroid::OnDidExitFullscreen() {
@@ -786,8 +783,6 @@
     player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
 #endif  // defined(VIDEO_HOLE)
 
-  frame_->view()->willExitFullScreen();
-  frame_->view()->didExitFullScreen();
   player_manager_->DidExitFullscreen();
   client_->repaint();
 }
diff --git a/content/renderer/web_preferences.cc b/content/renderer/web_preferences.cc
index bd975fd..0eb198d 100644
--- a/content/renderer/web_preferences.cc
+++ b/content/renderer/web_preferences.cc
@@ -294,6 +294,8 @@
   settings->setDeviceScaleAdjustment(prefs.device_scale_adjustment);
   web_view->setIgnoreViewportTagScaleLimits(prefs.force_enable_zoom);
   settings->setAutoZoomFocusedNodeToLegibleScale(true);
+  settings->setDisallowFullscreenForNonMediaElements(
+      prefs.disallow_fullscreen_for_non_media_elements);
   settings->setDoubleTapToZoomEnabled(prefs.double_tap_to_zoom_enabled);
   settings->setMediaControlsOverlayPlayButtonEnabled(true);
   settings->setMediaPlaybackRequiresUserGesture(
diff --git a/webkit/common/webpreferences.cc b/webkit/common/webpreferences.cc
index a953f4a..78834ac 100644
--- a/webkit/common/webpreferences.cc
+++ b/webkit/common/webpreferences.cc
@@ -120,6 +120,7 @@
       font_scale_factor(1.0f),
       device_scale_adjustment(1.0f),
       force_enable_zoom(false),
+      disallow_fullscreen_for_non_media_elements(false),
       double_tap_to_zoom_enabled(true),
       user_gesture_required_for_media_playback(true),
       support_deprecated_target_density_dpi(false),
diff --git a/webkit/common/webpreferences.h b/webkit/common/webpreferences.h
index 241fde3..cd675f9 100644
--- a/webkit/common/webpreferences.h
+++ b/webkit/common/webpreferences.h
@@ -165,6 +165,7 @@
   float font_scale_factor;
   float device_scale_adjustment;
   bool force_enable_zoom;
+  bool disallow_fullscreen_for_non_media_elements;
   bool double_tap_to_zoom_enabled;
   bool user_gesture_required_for_media_playback;
   GURL default_video_poster_url;