| Index: chromecast/shell/browser/android/cast_window_android.cc
|
| diff --git a/chromecast/shell/browser/android/cast_window_android.cc b/chromecast/shell/browser/android/cast_window_android.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..65380b147c2a83ff9c6c4fc9cf887bf2424869be
|
| --- /dev/null
|
| +++ b/chromecast/shell/browser/android/cast_window_android.cc
|
| @@ -0,0 +1,130 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chromecast/shell/browser/android/cast_window_android.h"
|
| +
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/path_service.h"
|
| +#include "chromecast/shell/browser/android/cast_window_manager.h"
|
| +#include "content/public/browser/devtools_agent_host.h"
|
| +#include "content/public/browser/navigation_controller.h"
|
| +#include "content/public/browser/navigation_entry.h"
|
| +#include "content/public/browser/render_view_host.h"
|
| +#include "content/public/common/renderer_preferences.h"
|
| +#include "jni/CastWindowAndroid_jni.h"
|
| +
|
| +namespace chromecast {
|
| +namespace shell {
|
| +
|
| +// static
|
| +bool CastWindowAndroid::RegisterJni(JNIEnv* env) {
|
| + return RegisterNativesImpl(env);
|
| +}
|
| +
|
| +CastWindowAndroid::CastWindowAndroid(content::WebContents* web_contents)
|
| + : content::WebContentsObserver(web_contents) {
|
| +}
|
| +
|
| +CastWindowAndroid::~CastWindowAndroid() {
|
| +}
|
| +
|
| +// static
|
| +CastWindowAndroid* CastWindowAndroid::CreateNewWindow(
|
| + content::BrowserContext* browser_context,
|
| + const GURL& url) {
|
| + content::WebContents::CreateParams create_params(browser_context);
|
| + create_params.routing_id = MSG_ROUTING_NONE;
|
| + content::WebContents* web_contents =
|
| + content::WebContents::Create(create_params);
|
| + CastWindowAndroid* shell = CreateCastWindowAndroid(
|
| + web_contents,
|
| + create_params.initial_size);
|
| + if (!url.is_empty())
|
| + shell->LoadURL(url);
|
| + return shell;
|
| +}
|
| +
|
| +// static
|
| +CastWindowAndroid* CastWindowAndroid::CreateCastWindowAndroid(
|
| + content::WebContents* web_contents,
|
| + const gfx::Size& initial_size) {
|
| + CastWindowAndroid* shell = new CastWindowAndroid(web_contents);
|
| +
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + base::android::ScopedJavaLocalRef<jobject> shell_android(
|
| + CreateCastWindowView(shell));
|
| +
|
| + shell->java_object_.Reset(env, shell_android.Release());
|
| + shell->web_contents_.reset(web_contents);
|
| + web_contents->SetDelegate(shell);
|
| +
|
| + Java_CastWindowAndroid_initFromNativeWebContents(
|
| + env, shell->java_object_.obj(), reinterpret_cast<jint>(web_contents));
|
| +
|
| + // Enabling hole-punching also requires runtime renderer preference
|
| + web_contents->GetMutableRendererPrefs()->
|
| + use_video_overlay_for_embedded_encrypted_video = true;
|
| + web_contents->GetRenderViewHost()->SyncRendererPrefs();
|
| +
|
| + return shell;
|
| +}
|
| +
|
| +void CastWindowAndroid::Close() {
|
| + // Note: if multiple windows becomes supported, this may close other devtools
|
| + // sessions.
|
| + content::DevToolsAgentHost::DetachAllClients();
|
| + CloseCastWindowView(java_object_.obj());
|
| + delete this;
|
| +}
|
| +
|
| +void CastWindowAndroid::LoadURL(const GURL& url) {
|
| + content::NavigationController::LoadURLParams params(url);
|
| + params.transition_type = content::PageTransitionFromInt(
|
| + content::PAGE_TRANSITION_TYPED |
|
| + content::PAGE_TRANSITION_FROM_ADDRESS_BAR);
|
| + web_contents_->GetController().LoadURLWithParams(params);
|
| + web_contents_->Focus();
|
| +}
|
| +
|
| +void CastWindowAndroid::AddNewContents(content::WebContents* source,
|
| + content::WebContents* new_contents,
|
| + WindowOpenDisposition disposition,
|
| + const gfx::Rect& initial_pos,
|
| + bool user_gesture,
|
| + bool* was_blocked) {
|
| + NOTIMPLEMENTED();
|
| + if (was_blocked) {
|
| + *was_blocked = true;
|
| + }
|
| +}
|
| +
|
| +void CastWindowAndroid::CloseContents(content::WebContents* source) {
|
| + DCHECK_EQ(source, web_contents_.get());
|
| + Close();
|
| +}
|
| +
|
| +bool CastWindowAndroid::CanOverscrollContent() const {
|
| + return false;
|
| +}
|
| +
|
| +bool CastWindowAndroid::AddMessageToConsole(content::WebContents* source,
|
| + int32 level,
|
| + const base::string16& message,
|
| + int32 line_no,
|
| + const base::string16& source_id) {
|
| + return false;
|
| +}
|
| +
|
| +void CastWindowAndroid::ActivateContents(content::WebContents* contents) {
|
| + DCHECK_EQ(contents, web_contents_.get());
|
| + contents->GetRenderViewHost()->Focus();
|
| +}
|
| +
|
| +void CastWindowAndroid::DeactivateContents(content::WebContents* contents) {
|
| + DCHECK_EQ(contents, web_contents_.get());
|
| + contents->GetRenderViewHost()->Blur();
|
| +}
|
| +
|
| +} // namespace shell
|
| +} // namespace chromecast
|
|
|