Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1668)

Side by Side Diff: chrome/browser/android/vr_shell/vr_shell.cc

Issue 2436863002: Use the HTML UI to render WebVR warnings (Closed)
Patch Set: Make openGL call sequences identical to how they were before. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/vr_shell/vr_shell.h" 5 #include "chrome/browser/android/vr_shell/vr_shell.h"
6 6
7 #include "base/metrics/histogram_macros.h" 7 #include "base/metrics/histogram_macros.h"
8 #include "chrome/browser/android/vr_shell/ui_elements.h" 8 #include "chrome/browser/android/vr_shell/ui_elements.h"
9 #include "chrome/browser/android/vr_shell/ui_interface.h" 9 #include "chrome/browser/android/vr_shell/ui_interface.h"
10 #include "chrome/browser/android/vr_shell/ui_scene.h" 10 #include "chrome/browser/android/vr_shell/ui_scene.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 static constexpr float kReticleOffset = 0.99f; 66 static constexpr float kReticleOffset = 0.99f;
67 67
68 // Limit the rendering distance of the reticle to the distance to a corner of 68 // Limit the rendering distance of the reticle to the distance to a corner of
69 // the content quad, times this value. This lets the rendering distance 69 // the content quad, times this value. This lets the rendering distance
70 // adjust according to content quad placement. 70 // adjust according to content quad placement.
71 static constexpr float kReticleDistanceMultiplier = 1.5f; 71 static constexpr float kReticleDistanceMultiplier = 1.5f;
72 72
73 // UI element 0 is the browser content rectangle. 73 // UI element 0 is the browser content rectangle.
74 static constexpr int kBrowserUiElementId = 0; 74 static constexpr int kBrowserUiElementId = 0;
75 75
76 // Positions and sizes of statically placed UI elements in the UI texture.
77 // TODO(klausw): replace the hardcoded positions with JS position/offset
78 // retrieval once the infrastructure for that is hooked up.
79 //
80 // UI is designed with 1 pixel = 1mm at 1m distance. It's rescaled to
81 // maintain the same angular resolution if placed closer or further.
82 // The warning overlays should be fairly close since they cut holes
83 // into geometry (they ignore the Z buffer), leading to odd effects
84 // if they are far away.
85 static constexpr vr_shell::Recti kWebVrWarningTransientRect = {
86 0, 128, 512, 250};
87 static constexpr vr_shell::Recti kWebVrWarningPermanentRect = {0, 0, 512, 128};
88 static constexpr float kWebVrWarningDistance = 0.7f; // meters
89 static constexpr float kWebVrWarningPermanentAngle = 16.3f; // degrees up
90 // How long the transient warning needs to be displayed.
91 static constexpr int64_t kWebVrWarningSeconds = 30;
92
93 static constexpr int kFramePrimaryBuffer = 0; 76 static constexpr int kFramePrimaryBuffer = 0;
94 static constexpr int kFrameHeadlockedBuffer = 1; 77 static constexpr int kFrameHeadlockedBuffer = 1;
95 78
96 vr_shell::VrShell* g_instance; 79 vr_shell::VrShell* g_instance;
97 80
98 static const char kVrShellUIURL[] = "chrome://vr-shell-ui"; 81 static const char kVrShellUIURL[] = "chrome://vr-shell-ui";
99 82
100 float Distance(const gvr::Vec3f& vec1, const gvr::Vec3f& vec2) { 83 float Distance(const gvr::Vec3f& vec1, const gvr::Vec3f& vec2) {
101 float xdiff = (vec1.x - vec2.x); 84 float xdiff = (vec1.x - vec2.x);
102 float ydiff = (vec1.y - vec2.y); 85 float ydiff = (vec1.y - vec2.y);
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 // The head pose has redundant data. Assume we're only using the 420 // The head pose has redundant data. Assume we're only using the
438 // object_from_reference_matrix, we're not updating position_external. 421 // object_from_reference_matrix, we're not updating position_external.
439 // TODO: Not sure what object_from_reference_matrix is. The new api removed 422 // TODO: Not sure what object_from_reference_matrix is. The new api removed
440 // it. For now, removing it seems working fine. 423 // it. For now, removing it seems working fine.
441 gvr_api_->ApplyNeckModel(head_pose, 1.0f); 424 gvr_api_->ApplyNeckModel(head_pose, 1.0f);
442 } 425 }
443 426
444 // Bind the primary framebuffer. 427 // Bind the primary framebuffer.
445 frame.BindBuffer(kFramePrimaryBuffer); 428 frame.BindBuffer(kFramePrimaryBuffer);
446 429
430 HandleQueuedTasks();
431
432 // Update the render position of all UI elements (including desktop).
433 float screen_tilt = desktop_screen_tilt_ * M_PI / 180.0f;
434 scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds());
435
447 if (webvr_mode_) { 436 if (webvr_mode_) {
448 DrawWebVr(); 437 DrawWebVr();
449 // Wait for the DOM contents to be loaded before rendering to avoid drawing
450 // white rectangles with no content.
451 if (!webvr_secure_origin_ && IsUiTextureReady()) {
452 size_t last_viewport = buffer_viewport_list_->GetSize();
453 buffer_viewport_list_->SetBufferViewport(last_viewport++,
454 *headlocked_left_viewport_);
455 buffer_viewport_list_->SetBufferViewport(last_viewport++,
456 *headlocked_right_viewport_);
457 438
458 // Bind the headlocked framebuffer. 439 size_t last_viewport = buffer_viewport_list_->GetSize();
459 frame.BindBuffer(kFrameHeadlockedBuffer); 440 buffer_viewport_list_->SetBufferViewport(last_viewport++,
460 DrawWebVrOverlay(target_time.monotonic_system_time_nanos); 441 *headlocked_left_viewport_);
461 } 442 buffer_viewport_list_->SetBufferViewport(last_viewport++,
443 *headlocked_right_viewport_);
444
445 // Bind the headlocked framebuffer.
446 frame.BindBuffer(kFrameHeadlockedBuffer);
bajones 2016/10/24 21:12:27 I don't know how much of a perf hit this introduce
cjgrant 2016/10/24 21:34:57 On determining if there's anything to draw: Yes,
cjgrant 2016/10/25 20:09:07 So this refactor was a little bigger than I expect
462 447
463 // When using async reprojection, we need to know which pose was used in 448 // When using async reprojection, we need to know which pose was used in
464 // the WebVR app for drawing this frame. Due to unknown amounts of 449 // the WebVR app for drawing this frame. Due to unknown amounts of
465 // buffering in the compositor and SurfaceTexture, we read the pose number 450 // buffering in the compositor and SurfaceTexture, we read the pose number
466 // from a corner pixel. There's no point in doing this for legacy 451 // from a corner pixel. There's no point in doing this for legacy
467 // distortion rendering since that doesn't need a pose, and reading back 452 // distortion rendering since that doesn't need a pose, and reading back
468 // pixels is an expensive operation. TODO(klausw): stop doing this once we 453 // pixels is an expensive operation. TODO(klausw): stop doing this once we
469 // have working no-compositor rendering for WebVR. 454 // have working no-compositor rendering for WebVR.
470 if (gvr_api_->GetAsyncReprojectionEnabled()) { 455 if (gvr_api_->GetAsyncReprojectionEnabled()) {
471 uint32_t webvr_pose_frame = GetPixelEncodedPoseIndex(); 456 uint32_t webvr_pose_frame = GetPixelEncodedPoseIndex();
472 head_pose = webvr_head_pose_[webvr_pose_frame % kPoseRingBufferSize]; 457 head_pose = webvr_head_pose_[webvr_pose_frame % kPoseRingBufferSize];
473 } 458 }
474 } else { 459 } else {
475 DrawVrShell(head_pose); 460 UpdateController(GetForwardVector(head_pose));
476 } 461 }
477 462
463 DrawVrShell(head_pose);
464
478 frame.Unbind(); 465 frame.Unbind();
479 frame.Submit(*buffer_viewport_list_, head_pose); 466 frame.Submit(*buffer_viewport_list_, head_pose);
480 } 467 }
481 468
482 void VrShell::DrawVrShell(const gvr::Mat4f& head_pose) { 469 void VrShell::DrawVrShell(const gvr::Mat4f& head_pose) {
483 float screen_tilt = desktop_screen_tilt_ * M_PI / 180.0f; 470 if (!webvr_mode_) {
484 471 glEnable(GL_CULL_FACE);
cjgrant 2016/10/24 20:05:09 Brandon, in this CL, I try to leave the sequence o
bajones 2016/10/24 21:12:27 Sure, let's grab a moment to chat. Stick something
485 HandleQueuedTasks(); 472 glEnable(GL_DEPTH_TEST);
486 473 glEnable(GL_SCISSOR_TEST);
487 // Update the render position of all UI elements (including desktop). 474 glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
488 scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds()); 475 } else {
489 476 glClear(GL_COLOR_BUFFER_BIT);
490 UpdateController(GetForwardVector(head_pose)); 477 }
491
492 // Use culling to remove back faces.
493 glEnable(GL_CULL_FACE);
494
495 // Enable depth testing.
496 glEnable(GL_DEPTH_TEST);
497 glEnable(GL_SCISSOR_TEST);
498
499 glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
500 478
501 buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE, 479 buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE,
502 buffer_viewport_.get()); 480 buffer_viewport_.get());
503 DrawEye(GVR_LEFT_EYE, head_pose, *buffer_viewport_); 481 DrawEye(GVR_LEFT_EYE, head_pose, *buffer_viewport_);
504 buffer_viewport_list_->GetBufferViewport(GVR_RIGHT_EYE, 482 buffer_viewport_list_->GetBufferViewport(GVR_RIGHT_EYE,
505 buffer_viewport_.get()); 483 buffer_viewport_.get());
506 DrawEye(GVR_RIGHT_EYE, head_pose, *buffer_viewport_); 484 DrawEye(GVR_RIGHT_EYE, head_pose, *buffer_viewport_);
507 } 485 }
508 486
509 void VrShell::DrawEye(gvr::Eye eye, 487 void VrShell::DrawEye(gvr::Eye eye,
(...skipping 11 matching lines...) Expand all
521 pixel_rect.right - pixel_rect.left, 499 pixel_rect.right - pixel_rect.left,
522 pixel_rect.top - pixel_rect.bottom); 500 pixel_rect.top - pixel_rect.bottom);
523 501
524 const gvr::Mat4f fov_render_matrix = MatrixMul( 502 const gvr::Mat4f fov_render_matrix = MatrixMul(
525 PerspectiveMatrixFromView(params.GetSourceFov(), kZNear, kZFar), 503 PerspectiveMatrixFromView(params.GetSourceFov(), kZNear, kZFar),
526 eye_matrix); 504 eye_matrix);
527 const gvr::Mat4f world_render_matrix = MatrixMul( 505 const gvr::Mat4f world_render_matrix = MatrixMul(
528 PerspectiveMatrixFromView(params.GetSourceFov(), kZNear, kZFar), 506 PerspectiveMatrixFromView(params.GetSourceFov(), kZNear, kZFar),
529 view_matrix); 507 view_matrix);
530 508
531 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 509 if (!webvr_mode_) {
510 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
511 }
532 512
533 // TODO(mthiesse): Draw order for transparency. 513 // TODO(mthiesse): Draw order for transparency.
534 DrawUI(world_render_matrix, fov_render_matrix); 514 DrawUI(world_render_matrix, fov_render_matrix);
535 DrawCursor(world_render_matrix); 515 if (!webvr_mode_) {
536 } 516 DrawCursor(world_render_matrix);
537 517 }
538 bool VrShell::IsUiTextureReady() {
539 return ui_tex_width_ > 0 && ui_tex_height_ > 0 && dom_contents_loaded_;
540 }
541
542 Rectf VrShell::MakeUiGlCopyRect(Recti pixel_rect) {
543 CHECK(IsUiTextureReady());
544 return Rectf({
545 static_cast<float>(pixel_rect.x) / ui_tex_width_,
546 static_cast<float>(pixel_rect.y) / ui_tex_height_,
547 static_cast<float>(pixel_rect.width) / ui_tex_width_,
548 static_cast<float>(pixel_rect.height) / ui_tex_height_});
549 } 518 }
550 519
551 void VrShell::DrawUI(const gvr::Mat4f& world_matrix, 520 void VrShell::DrawUI(const gvr::Mat4f& world_matrix,
552 const gvr::Mat4f& fov_matrix) { 521 const gvr::Mat4f& fov_matrix) {
553 for (const auto& rect : scene_->GetUiElements()) { 522 for (const auto& rect : scene_->GetUiElements()) {
554 if (!rect->visible) { 523 if (!rect->visible) {
555 continue; 524 continue;
556 } 525 }
526 if (webvr_mode_ && rect->id == kBrowserUiElementId) {
527 continue;
528 }
557 529
558 Rectf copy_rect; 530 Rectf copy_rect;
559 jint texture_handle; 531 jint texture_handle;
560 if (rect->id == kBrowserUiElementId) { 532 if (rect->id == kBrowserUiElementId) {
561 copy_rect = {0, 0, 1, 1}; 533 copy_rect = {0, 0, 1, 1};
562 texture_handle = content_texture_id_; 534 texture_handle = content_texture_id_;
563 } else { 535 } else {
564 copy_rect.x = static_cast<float>(rect->copy_rect.x) / ui_tex_width_; 536 copy_rect.x = static_cast<float>(rect->copy_rect.x) / ui_tex_width_;
565 copy_rect.y = static_cast<float>(rect->copy_rect.y) / ui_tex_height_; 537 copy_rect.y = static_cast<float>(rect->copy_rect.y) / ui_tex_height_;
566 copy_rect.width = static_cast<float>(rect->copy_rect.width) / 538 copy_rect.width = static_cast<float>(rect->copy_rect.width) /
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 glDisable(GL_BLEND); 633 glDisable(GL_BLEND);
662 glDisable(GL_POLYGON_OFFSET_FILL); 634 glDisable(GL_POLYGON_OFFSET_FILL);
663 635
664 // Don't need to clear, since we're drawing over the entire render target. 636 // Don't need to clear, since we're drawing over the entire render target.
665 glClear(GL_COLOR_BUFFER_BIT); 637 glClear(GL_COLOR_BUFFER_BIT);
666 638
667 glViewport(0, 0, render_size_.width, render_size_.height); 639 glViewport(0, 0, render_size_.width, render_size_.height);
668 vr_shell_renderer_->GetWebVrRenderer()->Draw(content_texture_id_); 640 vr_shell_renderer_->GetWebVrRenderer()->Draw(content_texture_id_);
669 } 641 }
670 642
671 void VrShell::DrawWebVrOverlay(int64_t present_time_nanos) {
672 // Draw WebVR security warning overlays for each eye. This uses the
673 // eye-from-head matrices but not the pose, goal is to place the icons in an
674 // eye-relative position so that they follow along with head rotations.
675
676 gvr::Mat4f left_eye_view_matrix =
677 gvr_api_->GetEyeFromHeadMatrix(GVR_LEFT_EYE);
678 gvr::Mat4f right_eye_view_matrix =
679 gvr_api_->GetEyeFromHeadMatrix(GVR_RIGHT_EYE);
680
681 glClear(GL_COLOR_BUFFER_BIT);
682
683 buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE,
684 buffer_viewport_.get());
685 DrawWebVrEye(left_eye_view_matrix, *buffer_viewport_, present_time_nanos);
686 buffer_viewport_list_->GetBufferViewport(GVR_RIGHT_EYE,
687 buffer_viewport_.get());
688 DrawWebVrEye(right_eye_view_matrix, *buffer_viewport_, present_time_nanos);
689 }
690
691 void VrShell::DrawWebVrEye(const gvr::Mat4f& view_matrix,
692 const gvr::BufferViewport& params,
693 int64_t present_time_nanos) {
694 gvr::Recti pixel_rect =
695 CalculatePixelSpaceRect(render_size_, params.GetSourceUv());
696 glViewport(pixel_rect.left, pixel_rect.bottom,
697 pixel_rect.right - pixel_rect.left,
698 pixel_rect.top - pixel_rect.bottom);
699 glScissor(pixel_rect.left, pixel_rect.bottom,
700 pixel_rect.right - pixel_rect.left,
701 pixel_rect.top - pixel_rect.bottom);
702
703 gvr::Mat4f projection_matrix =
704 PerspectiveMatrixFromView(params.GetSourceFov(), kZNear, kZFar);
705
706 if (!IsUiTextureReady()) {
707 // If the UI texture hasn't been initialized yet, we can't draw the overlay.
708 return;
709 }
710
711 // Show IDS_WEBSITE_SETTINGS_INSECURE_WEBVR_CONTENT_PERMANENT text.
712 gvr::Mat4f icon_pos;
713 SetIdentityM(icon_pos);
714 // The UI is designed in pixels with the assumption that 1px = 1mm at 1m
715 // distance. Scale mm-to-m and adjust to keep the same angular size if the
716 // distance changes.
717 const float small_icon_width =
718 kWebVrWarningPermanentRect.width / 1000.f * kWebVrWarningDistance;
719 const float small_icon_height =
720 kWebVrWarningPermanentRect.height / 1000.f * kWebVrWarningDistance;
721 const float small_icon_angle =
722 kWebVrWarningPermanentAngle * M_PI / 180.f; // Degrees to radians.
723 ScaleM(icon_pos, icon_pos, small_icon_width, small_icon_height, 1.0f);
724 TranslateM(icon_pos, icon_pos, 0.0f, 0.0f, -kWebVrWarningDistance);
725 icon_pos = MatrixMul(
726 QuatToMatrix(QuatFromAxisAngle({1.f, 0.f, 0.f}, small_icon_angle)),
727 icon_pos);
728 gvr::Mat4f combined = MatrixMul(projection_matrix,
729 MatrixMul(view_matrix, icon_pos));
730 vr_shell_renderer_->GetTexturedQuadRenderer()->Draw(
731 ui_texture_id_, combined, MakeUiGlCopyRect(kWebVrWarningPermanentRect));
732
733 // Check if we also need to show the transient warning.
734 if (present_time_nanos > webvr_warning_end_nanos_) {
735 return;
736 }
737
738 // Show IDS_WEBSITE_SETTINGS_INSECURE_WEBVR_CONTENT_TRANSIENT text.
739 SetIdentityM(icon_pos);
740 const float large_icon_width =
741 kWebVrWarningTransientRect.width / 1000.f * kWebVrWarningDistance;
742 const float large_icon_height =
743 kWebVrWarningTransientRect.height / 1000.f * kWebVrWarningDistance;
744 ScaleM(icon_pos, icon_pos, large_icon_width, large_icon_height, 1.0f);
745 TranslateM(icon_pos, icon_pos, 0.0f, 0.0f, -kWebVrWarningDistance);
746 combined = MatrixMul(projection_matrix,
747 MatrixMul(view_matrix, icon_pos));
748 vr_shell_renderer_->GetTexturedQuadRenderer()->Draw(
749 ui_texture_id_, combined, MakeUiGlCopyRect(kWebVrWarningTransientRect));
750
751 }
752
753 void VrShell::OnTriggerEvent(JNIEnv* env, const JavaParamRef<jobject>& obj) { 643 void VrShell::OnTriggerEvent(JNIEnv* env, const JavaParamRef<jobject>& obj) {
754 // Set a flag to handle this on the render thread at the next frame. 644 // Set a flag to handle this on the render thread at the next frame.
755 touch_pending_ = true; 645 touch_pending_ = true;
756 } 646 }
757 647
758 void VrShell::OnPause(JNIEnv* env, const JavaParamRef<jobject>& obj) { 648 void VrShell::OnPause(JNIEnv* env, const JavaParamRef<jobject>& obj) {
759 if (gvr_api_ == nullptr) 649 if (gvr_api_ == nullptr)
760 return; 650 return;
761 controller_->OnPause(); 651 controller_->OnPause();
762 gvr_api_->PauseTracking(); 652 gvr_api_->PauseTracking();
(...skipping 29 matching lines...) Expand all
792 SK_ColorTRANSPARENT); 682 SK_ColorTRANSPARENT);
793 html_interface_->OnDomContentsLoaded(); 683 html_interface_->OnDomContentsLoaded();
794 dom_contents_loaded_ = true; 684 dom_contents_loaded_ = true;
795 } 685 }
796 686
797 void VrShell::SetWebVrMode(JNIEnv* env, 687 void VrShell::SetWebVrMode(JNIEnv* env,
798 const base::android::JavaParamRef<jobject>& obj, 688 const base::android::JavaParamRef<jobject>& obj,
799 bool enabled) { 689 bool enabled) {
800 webvr_mode_ = enabled; 690 webvr_mode_ = enabled;
801 if (enabled) { 691 if (enabled) {
802 int64_t now = gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos;
803 constexpr int64_t seconds_to_nanos = 1000 * 1000 * 1000;
804 webvr_warning_end_nanos_ = now + kWebVrWarningSeconds * seconds_to_nanos;
805 html_interface_->SetMode(UiInterface::Mode::WEB_VR); 692 html_interface_->SetMode(UiInterface::Mode::WEB_VR);
806 } else { 693 } else {
807 webvr_warning_end_nanos_ = 0;
808 html_interface_->SetMode(UiInterface::Mode::STANDARD); 694 html_interface_->SetMode(UiInterface::Mode::STANDARD);
809 } 695 }
810 } 696 }
811 697
812 void VrShell::SetWebVRSecureOrigin(bool secure_origin) { 698 void VrShell::SetWebVRSecureOrigin(bool secure_origin) {
813 webvr_secure_origin_ = secure_origin; 699 html_interface_->SetSecureOrigin(secure_origin);
814 } 700 }
815 701
816 void VrShell::SubmitWebVRFrame() { 702 void VrShell::SubmitWebVRFrame() {
817 } 703 }
818 704
819 void VrShell::UpdateWebVRTextureBounds( 705 void VrShell::UpdateWebVRTextureBounds(
820 int eye, float left, float top, float width, float height) { 706 int eye, float left, float top, float width, float height) {
821 gvr::Rectf bounds = { left, top, width, height }; 707 gvr::Rectf bounds = { left, top, width, height };
822 vr_shell_renderer_->GetWebVrRenderer()->UpdateTextureBounds(eye, bounds); 708 vr_shell_renderer_->GetWebVrRenderer()->UpdateTextureBounds(eye, bounds);
823 } 709 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 const JavaParamRef<jobject>& ui_web_contents, 802 const JavaParamRef<jobject>& ui_web_contents,
917 jlong ui_window_android) { 803 jlong ui_window_android) {
918 return reinterpret_cast<intptr_t>(new VrShell( 804 return reinterpret_cast<intptr_t>(new VrShell(
919 env, obj, content::WebContents::FromJavaWebContents(content_web_contents), 805 env, obj, content::WebContents::FromJavaWebContents(content_web_contents),
920 reinterpret_cast<ui::WindowAndroid*>(content_window_android), 806 reinterpret_cast<ui::WindowAndroid*>(content_window_android),
921 content::WebContents::FromJavaWebContents(ui_web_contents), 807 content::WebContents::FromJavaWebContents(ui_web_contents),
922 reinterpret_cast<ui::WindowAndroid*>(ui_window_android))); 808 reinterpret_cast<ui::WindowAndroid*>(ui_window_android)));
923 } 809 }
924 810
925 } // namespace vr_shell 811 } // namespace vr_shell
OLDNEW
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698