| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/renderer/render_widget.h" | 5 #include "chrome/renderer/render_widget.h" |
| 6 | 6 |
| 7 #include "app/surface/transport_dib.h" | 7 #include "app/surface/transport_dib.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| 11 #include "base/scoped_ptr.h" | 11 #include "base/scoped_ptr.h" |
| 12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
| 13 #include "chrome/common/chrome_switches.h" | 13 #include "chrome/common/chrome_switches.h" |
| 14 #include "chrome/common/render_messages.h" | 14 #include "chrome/common/render_messages.h" |
| 15 #include "chrome/renderer/render_process.h" | 15 #include "chrome/renderer/render_process.h" |
| 16 #include "chrome/renderer/render_thread.h" | 16 #include "chrome/renderer/render_thread.h" |
| 17 #include "gfx/point.h" | 17 #include "gfx/point.h" |
| 18 #include "gfx/size.h" | 18 #include "gfx/size.h" |
| 19 #include "skia/ext/platform_canvas.h" | 19 #include "skia/ext/platform_canvas.h" |
| 20 #include "third_party/skia/include/core/SkShader.h" | 20 #include "third_party/skia/include/core/SkShader.h" |
| 21 #include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h" | 21 #include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h" |
| 22 #include "third_party/WebKit/WebKit/chromium/public/WebPopupMenu.h" | 22 #include "third_party/WebKit/WebKit/chromium/public/WebPopupMenu.h" |
| 23 #include "third_party/WebKit/WebKit/chromium/public/WebPopupMenuInfo.h" | 23 #include "third_party/WebKit/WebKit/chromium/public/WebPopupMenuInfo.h" |
| 24 #include "third_party/WebKit/WebKit/chromium/public/WebRect.h" | 24 #include "third_party/WebKit/WebKit/chromium/public/WebRect.h" |
| 25 #include "third_party/WebKit/WebKit/chromium/public/WebScreenInfo.h" | 25 #include "third_party/WebKit/WebKit/chromium/public/WebScreenInfo.h" |
| 26 #include "third_party/WebKit/WebKit/chromium/public/WebSize.h" | 26 #include "third_party/WebKit/WebKit/chromium/public/WebSize.h" |
| 27 #include "webkit/glue/webkit_glue.h" | 27 #include "webkit/glue/webkit_glue.h" |
| 28 | 28 |
| 29 // TODO(apatrick): begin hack. Will remove before checkin. |
| 30 #if defined(OS_WIN) && defined(ENABLE_GPU) |
| 31 #include "chrome/renderer/ggl/ggl.h" |
| 32 #include "gpu/gles2/gl2.h" |
| 33 #endif |
| 34 // end hack |
| 35 |
| 29 #if defined(OS_POSIX) | 36 #if defined(OS_POSIX) |
| 30 #include "ipc/ipc_channel_posix.h" | 37 #include "ipc/ipc_channel_posix.h" |
| 31 #include "third_party/skia/include/core/SkPixelRef.h" | 38 #include "third_party/skia/include/core/SkPixelRef.h" |
| 32 #include "third_party/skia/include/core/SkMallocPixelRef.h" | 39 #include "third_party/skia/include/core/SkMallocPixelRef.h" |
| 33 #endif // defined(OS_POSIX) | 40 #endif // defined(OS_POSIX) |
| 34 | 41 |
| 35 #include "third_party/WebKit/WebKit/chromium/public/WebWidget.h" | 42 #include "third_party/WebKit/WebKit/chromium/public/WebWidget.h" |
| 36 | 43 |
| 37 using WebKit::WebCompositionCommand; | 44 using WebKit::WebCompositionCommand; |
| 38 using WebKit::WebCursorInfo; | 45 using WebKit::WebCursorInfo; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck) | 150 IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck) |
| 144 IPC_MESSAGE_HANDLER(ViewMsg_CreateVideo_ACK, OnCreateVideoAck) | 151 IPC_MESSAGE_HANDLER(ViewMsg_CreateVideo_ACK, OnCreateVideoAck) |
| 145 IPC_MESSAGE_HANDLER(ViewMsg_UpdateVideo_ACK, OnUpdateVideoAck) | 152 IPC_MESSAGE_HANDLER(ViewMsg_UpdateVideo_ACK, OnUpdateVideoAck) |
| 146 IPC_MESSAGE_HANDLER(ViewMsg_HandleInputEvent, OnHandleInputEvent) | 153 IPC_MESSAGE_HANDLER(ViewMsg_HandleInputEvent, OnHandleInputEvent) |
| 147 IPC_MESSAGE_HANDLER(ViewMsg_MouseCaptureLost, OnMouseCaptureLost) | 154 IPC_MESSAGE_HANDLER(ViewMsg_MouseCaptureLost, OnMouseCaptureLost) |
| 148 IPC_MESSAGE_HANDLER(ViewMsg_SetFocus, OnSetFocus) | 155 IPC_MESSAGE_HANDLER(ViewMsg_SetFocus, OnSetFocus) |
| 149 IPC_MESSAGE_HANDLER(ViewMsg_ImeSetInputMode, OnImeSetInputMode) | 156 IPC_MESSAGE_HANDLER(ViewMsg_ImeSetInputMode, OnImeSetInputMode) |
| 150 IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition) | 157 IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition) |
| 151 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnMsgRepaint) | 158 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnMsgRepaint) |
| 152 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) | 159 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) |
| 153 IPC_MESSAGE_HANDLER(ViewMsg_GpuChannelEstablished, OnGpuChannelEstablished) | |
| 154 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) | 160 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) |
| 155 IPC_MESSAGE_UNHANDLED_ERROR() | 161 IPC_MESSAGE_UNHANDLED_ERROR() |
| 156 IPC_END_MESSAGE_MAP() | 162 IPC_END_MESSAGE_MAP() |
| 157 | 163 |
| 158 bool RenderWidget::Send(IPC::Message* message) { | 164 bool RenderWidget::Send(IPC::Message* message) { |
| 159 // Don't send any messages after the browser has told us to close. | 165 // Don't send any messages after the browser has told us to close. |
| 160 if (closing_) { | 166 if (closing_) { |
| 161 delete message; | 167 delete message; |
| 162 return false; | 168 return false; |
| 163 } | 169 } |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 } | 392 } |
| 387 | 393 |
| 388 webwidget_->paint(webkit_glue::ToWebCanvas(canvas), rect); | 394 webwidget_->paint(webkit_glue::ToWebCanvas(canvas), rect); |
| 389 | 395 |
| 390 PaintDebugBorder(rect, canvas); | 396 PaintDebugBorder(rect, canvas); |
| 391 | 397 |
| 392 // Flush to underlying bitmap. TODO(darin): is this needed? | 398 // Flush to underlying bitmap. TODO(darin): is this needed? |
| 393 canvas->getTopPlatformDevice().accessBitmap(false); | 399 canvas->getTopPlatformDevice().accessBitmap(false); |
| 394 | 400 |
| 395 canvas->restore(); | 401 canvas->restore(); |
| 402 |
| 403 // TODO(apatrick): begin hack. Will remove before checkin. This is an example
of how to call OpenGL from a renderer process. |
| 404 #if defined(OS_WIN) && defined(ENABLE_GPU) |
| 405 //GpuChannelHost* channel = RenderThread::current()->GetGpuChannel(); |
| 406 //if (!channel) { |
| 407 // RenderThread::current()->EstablishGpuChannel(); |
| 408 //} else { |
| 409 // DebugBreak(); |
| 410 // ggl::Context* view_context = ggl::CreateViewContext(channel, |
| 411 // host_window_); |
| 412 // ggl::Context* offscreen_context = ggl::CreateOffscreenContext(channel, vie
w_context, 256, 256); |
| 413 // GLuint offscreen_texture_id = ggl::GetParentTextureId(offscreen_context); |
| 414 |
| 415 // ggl::MakeCurrent(view_context); |
| 416 |
| 417 // GLenum error = glGetError(); |
| 418 // glBindTexture(GL_TEXTURE_2D, offscreen_texture_id); |
| 419 // error = glGetError(); |
| 420 |
| 421 // ggl::MakeCurrent(offscreen_context); |
| 422 // glClearColor(1, 1, 0, 1); |
| 423 // glClear(GL_COLOR_BUFFER_BIT); |
| 424 // ggl::SwapBuffers(); |
| 425 // glFinish(); |
| 426 |
| 427 // ggl::MakeCurrent(view_context); |
| 428 // glClearColor(1, 0, 1, 1); |
| 429 // glClear(GL_COLOR_BUFFER_BIT); |
| 430 // ggl::SwapBuffers(); |
| 431 |
| 432 // error = glGetError(); |
| 433 // glBindTexture(GL_TEXTURE_2D, offscreen_texture_id); |
| 434 // error = glGetError(); |
| 435 |
| 436 // ggl::DestroyContext(offscreen_context); |
| 437 // ggl::DestroyContext(view_context); |
| 438 //} |
| 439 #endif |
| 396 } | 440 } |
| 397 | 441 |
| 398 void RenderWidget::PaintDebugBorder(const gfx::Rect& rect, | 442 void RenderWidget::PaintDebugBorder(const gfx::Rect& rect, |
| 399 skia::PlatformCanvas* canvas) { | 443 skia::PlatformCanvas* canvas) { |
| 400 static bool kPaintBorder = | 444 static bool kPaintBorder = |
| 401 CommandLine::ForCurrentProcess()->HasSwitch(switches::kShowPaintRects); | 445 CommandLine::ForCurrentProcess()->HasSwitch(switches::kShowPaintRects); |
| 402 if (!kPaintBorder) | 446 if (!kPaintBorder) |
| 403 return; | 447 return; |
| 404 | 448 |
| 405 // Cycle through these colors to help distinguish new paint rects. | 449 // Cycle through these colors to help distinguish new paint rects. |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 gfx::Rect repaint_rect(size_to_paint.width(), size_to_paint.height()); | 769 gfx::Rect repaint_rect(size_to_paint.width(), size_to_paint.height()); |
| 726 didInvalidateRect(repaint_rect); | 770 didInvalidateRect(repaint_rect); |
| 727 } | 771 } |
| 728 | 772 |
| 729 void RenderWidget::OnSetTextDirection(WebTextDirection direction) { | 773 void RenderWidget::OnSetTextDirection(WebTextDirection direction) { |
| 730 if (!webwidget_) | 774 if (!webwidget_) |
| 731 return; | 775 return; |
| 732 webwidget_->setTextDirection(direction); | 776 webwidget_->setTextDirection(direction); |
| 733 } | 777 } |
| 734 | 778 |
| 735 void RenderWidget::OnGpuChannelEstablished( | |
| 736 const IPC::ChannelHandle& channel_handle) { | |
| 737 #if defined(OS_POSIX) | |
| 738 // If we received a ChannelHandle, register it now. | |
| 739 if (channel_handle.socket.fd >= 0) | |
| 740 IPC::AddChannelSocket(channel_handle.name, channel_handle.socket.fd); | |
| 741 #endif | |
| 742 | |
| 743 if (channel_handle.name.size() != 0) { | |
| 744 // Connect to the GPU process if a channel name was received. | |
| 745 gpu_channel_->Connect(channel_handle.name); | |
| 746 } else { | |
| 747 // Otherwise cancel the connection. | |
| 748 gpu_channel_ = NULL; | |
| 749 } | |
| 750 } | |
| 751 | |
| 752 void RenderWidget::SetHidden(bool hidden) { | 779 void RenderWidget::SetHidden(bool hidden) { |
| 753 if (is_hidden_ == hidden) | 780 if (is_hidden_ == hidden) |
| 754 return; | 781 return; |
| 755 | 782 |
| 756 // The status has changed. Tell the RenderThread about it. | 783 // The status has changed. Tell the RenderThread about it. |
| 757 is_hidden_ = hidden; | 784 is_hidden_ = hidden; |
| 758 if (is_hidden_) | 785 if (is_hidden_) |
| 759 render_thread_->WidgetHidden(); | 786 render_thread_->WidgetHidden(); |
| 760 else | 787 else |
| 761 render_thread_->WidgetRestored(); | 788 render_thread_->WidgetRestored(); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) { | 912 void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) { |
| 886 for (WebPluginGeometryVector::iterator i = plugin_window_moves_.begin(); | 913 for (WebPluginGeometryVector::iterator i = plugin_window_moves_.begin(); |
| 887 i != plugin_window_moves_.end(); ++i) { | 914 i != plugin_window_moves_.end(); ++i) { |
| 888 if (i->window == window) { | 915 if (i->window == window) { |
| 889 plugin_window_moves_.erase(i); | 916 plugin_window_moves_.erase(i); |
| 890 break; | 917 break; |
| 891 } | 918 } |
| 892 } | 919 } |
| 893 } | 920 } |
| 894 | 921 |
| 895 void RenderWidget::EstablishGpuChannel() { | |
| 896 if (gpu_channel_.get()) { | |
| 897 // Do nothing if we are already establishing GPU channel. | |
| 898 if (gpu_channel_->state() == GpuChannelHost::UNCONNECTED) | |
| 899 return; | |
| 900 | |
| 901 // Recreate the channel if it has been lost. | |
| 902 if (gpu_channel_->state() == GpuChannelHost::LOST) | |
| 903 gpu_channel_ = NULL; | |
| 904 } | |
| 905 | |
| 906 if (!gpu_channel_.get()) | |
| 907 gpu_channel_ = new GpuChannelHost; | |
| 908 | |
| 909 // Ask the browser for the channel name. | |
| 910 CHECK(Send(new ViewHostMsg_EstablishGpuChannel(routing_id_))); | |
| 911 } | |
| 912 | |
| 913 GpuChannelHost* RenderWidget::GetGpuChannel() { | |
| 914 if (!gpu_channel_.get()) | |
| 915 return NULL; | |
| 916 | |
| 917 if (gpu_channel_->state() != GpuChannelHost::CONNECTED) | |
| 918 return NULL; | |
| 919 | |
| 920 return gpu_channel_.get(); | |
| 921 } | |
| 922 | |
| OLD | NEW |