inspectable_web_contents_view_views.cc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #include "brightray/browser/views/inspectable_web_contents_view_views.h"
  2. #include "base/strings/utf_string_conversions.h"
  3. #include "brightray/browser/inspectable_web_contents_delegate.h"
  4. #include "brightray/browser/inspectable_web_contents_impl.h"
  5. #include "brightray/browser/inspectable_web_contents_view_delegate.h"
  6. #include "ui/views/controls/label.h"
  7. #include "ui/views/controls/webview/webview.h"
  8. #include "ui/views/widget/widget.h"
  9. #include "ui/views/widget/widget_delegate.h"
  10. #include "ui/views/window/client_view.h"
  11. namespace brightray {
  12. namespace {
  13. class DevToolsWindowDelegate : public views::ClientView,
  14. public views::WidgetDelegate {
  15. public:
  16. DevToolsWindowDelegate(InspectableWebContentsViewViews* shell,
  17. views::View* view,
  18. views::Widget* widget)
  19. : views::ClientView(widget, view),
  20. shell_(shell),
  21. view_(view),
  22. widget_(widget) {
  23. // A WidgetDelegate should be deleted on DeleteDelegate.
  24. set_owned_by_client();
  25. if (shell->GetDelegate())
  26. icon_ = shell->GetDelegate()->GetDevToolsWindowIcon();
  27. }
  28. ~DevToolsWindowDelegate() override {}
  29. // views::WidgetDelegate:
  30. void DeleteDelegate() override { delete this; }
  31. views::View* GetInitiallyFocusedView() override { return view_; }
  32. bool CanResize() const override { return true; }
  33. bool CanMaximize() const override { return true; }
  34. bool CanMinimize() const override { return true; }
  35. base::string16 GetWindowTitle() const override { return shell_->GetTitle(); }
  36. gfx::ImageSkia GetWindowAppIcon() override { return GetWindowIcon(); }
  37. gfx::ImageSkia GetWindowIcon() override { return icon_; }
  38. views::Widget* GetWidget() override { return widget_; }
  39. const views::Widget* GetWidget() const override { return widget_; }
  40. views::View* GetContentsView() override { return view_; }
  41. views::ClientView* CreateClientView(views::Widget* widget) override {
  42. return this;
  43. }
  44. // views::ClientView:
  45. bool CanClose() override {
  46. shell_->inspectable_web_contents()->CloseDevTools();
  47. return false;
  48. }
  49. private:
  50. InspectableWebContentsViewViews* shell_;
  51. views::View* view_;
  52. views::Widget* widget_;
  53. gfx::ImageSkia icon_;
  54. DISALLOW_COPY_AND_ASSIGN(DevToolsWindowDelegate);
  55. };
  56. } // namespace
  57. InspectableWebContentsView* CreateInspectableContentsView(
  58. InspectableWebContentsImpl* inspectable_web_contents) {
  59. return new InspectableWebContentsViewViews(inspectable_web_contents);
  60. }
  61. InspectableWebContentsViewViews::InspectableWebContentsViewViews(
  62. InspectableWebContentsImpl* inspectable_web_contents)
  63. : inspectable_web_contents_(inspectable_web_contents),
  64. devtools_window_web_view_(nullptr),
  65. contents_web_view_(nullptr),
  66. devtools_web_view_(new views::WebView(nullptr)),
  67. devtools_visible_(false),
  68. devtools_window_delegate_(nullptr),
  69. title_(base::ASCIIToUTF16("Developer Tools")) {
  70. set_owned_by_client();
  71. if (inspectable_web_contents_->GetWebContents()->GetNativeView()) {
  72. views::WebView* contents_web_view = new views::WebView(nullptr);
  73. contents_web_view->SetWebContents(
  74. inspectable_web_contents_->GetWebContents());
  75. contents_web_view_ = contents_web_view;
  76. } else {
  77. contents_web_view_ =
  78. new views::Label(base::ASCIIToUTF16("No content under offscreen mode"));
  79. }
  80. devtools_web_view_->SetVisible(false);
  81. AddChildView(devtools_web_view_);
  82. AddChildView(contents_web_view_);
  83. }
  84. InspectableWebContentsViewViews::~InspectableWebContentsViewViews() {
  85. if (devtools_window_)
  86. inspectable_web_contents()->SaveDevToolsBounds(
  87. devtools_window_->GetWindowBoundsInScreen());
  88. }
  89. views::View* InspectableWebContentsViewViews::GetView() {
  90. return this;
  91. }
  92. views::View* InspectableWebContentsViewViews::GetWebView() {
  93. return contents_web_view_;
  94. }
  95. void InspectableWebContentsViewViews::ShowDevTools() {
  96. if (devtools_visible_)
  97. return;
  98. devtools_visible_ = true;
  99. if (devtools_window_) {
  100. devtools_window_web_view_->SetWebContents(
  101. inspectable_web_contents_->GetDevToolsWebContents());
  102. devtools_window_->SetBounds(
  103. inspectable_web_contents()->GetDevToolsBounds());
  104. devtools_window_->Show();
  105. } else {
  106. devtools_web_view_->SetVisible(true);
  107. devtools_web_view_->SetWebContents(
  108. inspectable_web_contents_->GetDevToolsWebContents());
  109. devtools_web_view_->RequestFocus();
  110. Layout();
  111. }
  112. }
  113. void InspectableWebContentsViewViews::CloseDevTools() {
  114. if (!devtools_visible_)
  115. return;
  116. devtools_visible_ = false;
  117. if (devtools_window_) {
  118. inspectable_web_contents()->SaveDevToolsBounds(
  119. devtools_window_->GetWindowBoundsInScreen());
  120. devtools_window_.reset();
  121. devtools_window_web_view_ = nullptr;
  122. devtools_window_delegate_ = nullptr;
  123. } else {
  124. devtools_web_view_->SetVisible(false);
  125. devtools_web_view_->SetWebContents(NULL);
  126. Layout();
  127. }
  128. }
  129. bool InspectableWebContentsViewViews::IsDevToolsViewShowing() {
  130. return devtools_visible_;
  131. }
  132. bool InspectableWebContentsViewViews::IsDevToolsViewFocused() {
  133. if (devtools_window_web_view_)
  134. return devtools_window_web_view_->HasFocus();
  135. else if (devtools_web_view_)
  136. return devtools_web_view_->HasFocus();
  137. else
  138. return false;
  139. }
  140. void InspectableWebContentsViewViews::SetIsDocked(bool docked) {
  141. CloseDevTools();
  142. if (!docked) {
  143. devtools_window_.reset(new views::Widget);
  144. devtools_window_web_view_ = new views::WebView(NULL);
  145. devtools_window_delegate_ = new DevToolsWindowDelegate(
  146. this, devtools_window_web_view_, devtools_window_.get());
  147. views::Widget::InitParams params;
  148. params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
  149. params.delegate = devtools_window_delegate_;
  150. params.bounds = inspectable_web_contents()->GetDevToolsBounds();
  151. #if defined(USE_X11)
  152. params.wm_role_name = "devtools";
  153. if (GetDelegate())
  154. GetDelegate()->GetDevToolsWindowWMClass(&params.wm_class_name,
  155. &params.wm_class_class);
  156. #endif
  157. devtools_window_->Init(params);
  158. devtools_window_->UpdateWindowIcon();
  159. }
  160. ShowDevTools();
  161. }
  162. void InspectableWebContentsViewViews::SetContentsResizingStrategy(
  163. const DevToolsContentsResizingStrategy& strategy) {
  164. strategy_.CopyFrom(strategy);
  165. Layout();
  166. }
  167. void InspectableWebContentsViewViews::SetTitle(const base::string16& title) {
  168. if (devtools_window_) {
  169. title_ = title;
  170. devtools_window_->UpdateWindowTitle();
  171. }
  172. }
  173. void InspectableWebContentsViewViews::Layout() {
  174. if (!devtools_web_view_->visible()) {
  175. contents_web_view_->SetBoundsRect(GetContentsBounds());
  176. return;
  177. }
  178. gfx::Size container_size(width(), height());
  179. gfx::Rect new_devtools_bounds;
  180. gfx::Rect new_contents_bounds;
  181. ApplyDevToolsContentsResizingStrategy(
  182. strategy_, container_size, &new_devtools_bounds, &new_contents_bounds);
  183. // DevTools cares about the specific position, so we have to compensate RTL
  184. // layout here.
  185. new_devtools_bounds.set_x(GetMirroredXForRect(new_devtools_bounds));
  186. new_contents_bounds.set_x(GetMirroredXForRect(new_contents_bounds));
  187. devtools_web_view_->SetBoundsRect(new_devtools_bounds);
  188. contents_web_view_->SetBoundsRect(new_contents_bounds);
  189. }
  190. } // namespace brightray