OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/web_contents/web_contents_view_aura.h" | 5 #include "content/browser/web_contents/web_contents_view_aura.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "content/browser/renderer_host/dip_util.h" | 10 #include "content/browser/renderer_host/dip_util.h" |
11 #include "content/browser/renderer_host/overscroll_controller.h" | 11 #include "content/browser/renderer_host/overscroll_controller.h" |
12 #include "content/browser/renderer_host/render_view_host_factory.h" | 12 #include "content/browser/renderer_host/render_view_host_factory.h" |
13 #include "content/browser/renderer_host/render_widget_host_impl.h" | 13 #include "content/browser/renderer_host/render_widget_host_impl.h" |
14 #include "content/browser/renderer_host/render_widget_host_view_aura.h" | 14 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
15 #include "content/browser/web_contents/interstitial_page_impl.h" | 15 #include "content/browser/web_contents/interstitial_page_impl.h" |
16 #include "content/browser/web_contents/navigation_entry_impl.h" | 16 #include "content/browser/web_contents/navigation_entry_impl.h" |
17 #include "content/browser/web_contents/web_contents_impl.h" | 17 #include "content/browser/web_contents/web_contents_impl.h" |
18 #include "content/public/browser/notification_observer.h" | 18 #include "content/public/browser/notification_observer.h" |
19 #include "content/public/browser/notification_registrar.h" | 19 #include "content/public/browser/notification_registrar.h" |
20 #include "content/public/browser/notification_source.h" | 20 #include "content/public/browser/notification_source.h" |
21 #include "content/public/browser/notification_types.h" | 21 #include "content/public/browser/notification_types.h" |
22 #include "content/public/browser/overscroll_configuration.h" | 22 #include "content/public/browser/overscroll_configuration.h" |
23 #include "content/public/browser/render_view_host.h" | 23 #include "content/public/browser/render_view_host.h" |
24 #include "content/public/browser/render_widget_host.h" | 24 #include "content/public/browser/render_widget_host.h" |
25 #include "content/public/browser/render_widget_host_view.h" | 25 #include "content/public/browser/render_widget_host_view.h" |
26 #include "content/public/browser/web_contents_delegate.h" | 26 #include "content/public/browser/web_contents_delegate.h" |
27 #include "content/public/browser/web_contents_view_delegate.h" | 27 #include "content/public/browser/web_contents_view_delegate.h" |
28 #include "content/public/browser/web_drag_dest_delegate.h" | 28 #include "content/public/browser/web_drag_dest_delegate.h" |
29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" | 29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
| 30 #include "third_party/skia/include/effects/SkGradientShader.h" |
30 #include "ui/aura/client/aura_constants.h" | 31 #include "ui/aura/client/aura_constants.h" |
31 #include "ui/aura/client/drag_drop_client.h" | 32 #include "ui/aura/client/drag_drop_client.h" |
32 #include "ui/aura/client/drag_drop_delegate.h" | 33 #include "ui/aura/client/drag_drop_delegate.h" |
33 #include "ui/aura/root_window.h" | 34 #include "ui/aura/root_window.h" |
34 #include "ui/aura/root_window_observer.h" | 35 #include "ui/aura/root_window_observer.h" |
35 #include "ui/aura/window.h" | 36 #include "ui/aura/window.h" |
36 #include "ui/aura/window_observer.h" | 37 #include "ui/aura/window_observer.h" |
37 #include "ui/base/clipboard/custom_data_helper.h" | 38 #include "ui/base/clipboard/custom_data_helper.h" |
38 #include "ui/base/dragdrop/drag_drop_types.h" | 39 #include "ui/base/dragdrop/drag_drop_types.h" |
39 #include "ui/base/dragdrop/drag_utils.h" | 40 #include "ui/base/dragdrop/drag_utils.h" |
40 #include "ui/base/dragdrop/os_exchange_data.h" | 41 #include "ui/base/dragdrop/os_exchange_data.h" |
41 #include "ui/base/events/event.h" | 42 #include "ui/base/events/event.h" |
42 #include "ui/base/events/event_utils.h" | 43 #include "ui/base/events/event_utils.h" |
43 #include "ui/base/hit_test.h" | 44 #include "ui/base/hit_test.h" |
44 #include "ui/compositor/layer.h" | 45 #include "ui/compositor/layer.h" |
45 #include "ui/compositor/scoped_layer_animation_settings.h" | 46 #include "ui/compositor/scoped_layer_animation_settings.h" |
46 #include "ui/gfx/canvas.h" | 47 #include "ui/gfx/canvas.h" |
47 #include "ui/gfx/image/image.h" | 48 #include "ui/gfx/image/image.h" |
48 #include "ui/gfx/image/image_png_rep.h" | 49 #include "ui/gfx/image/image_png_rep.h" |
49 #include "ui/gfx/image/image_skia.h" | 50 #include "ui/gfx/image/image_skia.h" |
50 #include "ui/gfx/screen.h" | 51 #include "ui/gfx/screen.h" |
| 52 #include "ui/gfx/skia_util.h" |
51 #include "webkit/glue/webdropdata.h" | 53 #include "webkit/glue/webdropdata.h" |
52 | 54 |
53 #if defined(OS_WIN) | 55 #if defined(OS_WIN) |
54 #include "ui/base/clipboard/clipboard_util_win.h" | 56 #include "ui/base/clipboard/clipboard_util_win.h" |
55 #endif | 57 #endif |
56 | 58 |
57 namespace content { | 59 namespace content { |
58 WebContentsView* CreateWebContentsView( | 60 WebContentsView* CreateWebContentsView( |
59 WebContentsImpl* web_contents, | 61 WebContentsImpl* web_contents, |
60 WebContentsViewDelegate* delegate, | 62 WebContentsViewDelegate* delegate, |
61 RenderViewHostDelegateView** render_view_host_delegate_view) { | 63 RenderViewHostDelegateView** render_view_host_delegate_view) { |
62 WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate); | 64 WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate); |
63 *render_view_host_delegate_view = rv; | 65 *render_view_host_delegate_view = rv; |
64 return rv; | 66 return rv; |
65 } | 67 } |
66 | 68 |
67 namespace { | 69 namespace { |
68 | 70 |
| 71 const SkColor kShadowLightColor = SkColorSetARGB(0x0, 0, 0, 0); |
| 72 const SkColor kShadowDarkColor = SkColorSetARGB(0x70, 0, 0, 0); |
| 73 const int kShadowThick = 7; |
| 74 |
| 75 enum ShadowEdge { |
| 76 SHADOW_NONE, |
| 77 SHADOW_LEFT, |
| 78 SHADOW_RIGHT, |
| 79 SHADOW_TOP, |
| 80 SHADOW_BOTTOM |
| 81 }; |
| 82 |
69 bool ShouldNavigateForward(const NavigationController& controller, | 83 bool ShouldNavigateForward(const NavigationController& controller, |
70 OverscrollMode mode) { | 84 OverscrollMode mode) { |
71 return mode == (base::i18n::IsRTL() ? OVERSCROLL_EAST : OVERSCROLL_WEST) && | 85 return mode == (base::i18n::IsRTL() ? OVERSCROLL_EAST : OVERSCROLL_WEST) && |
72 controller.CanGoForward(); | 86 controller.CanGoForward(); |
73 } | 87 } |
74 | 88 |
75 bool ShouldNavigateBack(const NavigationController& controller, | 89 bool ShouldNavigateBack(const NavigationController& controller, |
76 OverscrollMode mode) { | 90 OverscrollMode mode) { |
77 return mode == (base::i18n::IsRTL() ? OVERSCROLL_WEST : OVERSCROLL_EAST) && | 91 return mode == (base::i18n::IsRTL() ? OVERSCROLL_WEST : OVERSCROLL_EAST) && |
78 controller.CanGoBack(); | 92 controller.CanGoBack(); |
79 } | 93 } |
80 | 94 |
81 // The window delegate for the overscroll window. This redirects trackpad events | 95 // The window delegate for the overscroll window. This redirects trackpad events |
82 // to the web-contents window. The delegate destroys itself when the window is | 96 // to the web-contents window. The delegate destroys itself when the window is |
83 // destroyed. | 97 // destroyed. |
84 class OverscrollWindowDelegate : public aura::WindowDelegate { | 98 class OverscrollWindowDelegate : public aura::WindowDelegate { |
85 public: | 99 public: |
86 OverscrollWindowDelegate(WebContentsImpl* web_contents, | 100 OverscrollWindowDelegate(WebContentsImpl* web_contents, |
87 OverscrollMode overscroll_mode) | 101 OverscrollMode overscroll_mode) |
88 : web_contents_(web_contents) { | 102 : web_contents_(web_contents), |
| 103 show_shadow_(false) { |
89 const NavigationControllerImpl& controller = web_contents->GetController(); | 104 const NavigationControllerImpl& controller = web_contents->GetController(); |
90 const NavigationEntryImpl* entry = NULL; | 105 const NavigationEntryImpl* entry = NULL; |
91 if (ShouldNavigateForward(controller, overscroll_mode)) { | 106 if (ShouldNavigateForward(controller, overscroll_mode)) { |
92 entry = NavigationEntryImpl::FromNavigationEntry( | 107 entry = NavigationEntryImpl::FromNavigationEntry( |
93 controller.GetEntryAtOffset(1)); | 108 controller.GetEntryAtOffset(1)); |
94 } else if (ShouldNavigateBack(controller, overscroll_mode)) { | 109 } else if (ShouldNavigateBack(controller, overscroll_mode)) { |
95 entry = NavigationEntryImpl::FromNavigationEntry( | 110 entry = NavigationEntryImpl::FromNavigationEntry( |
96 controller.GetEntryAtOffset(-1)); | 111 controller.GetEntryAtOffset(-1)); |
97 } | 112 } |
98 if (!entry || !entry->screenshot()) | 113 if (!entry || !entry->screenshot()) |
99 return; | 114 return; |
100 | 115 |
101 std::vector<gfx::ImagePNGRep> image_reps; | 116 std::vector<gfx::ImagePNGRep> image_reps; |
102 image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(), | 117 image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(), |
103 ui::GetScaleFactorForNativeView(web_contents_window()))); | 118 ui::GetScaleFactorForNativeView(web_contents_window()))); |
104 image_ = gfx::Image(image_reps); | 119 image_ = gfx::Image(image_reps); |
105 } | 120 } |
106 | 121 |
107 bool has_screenshot() const { return !image_.IsEmpty(); } | 122 bool has_screenshot() const { return !image_.IsEmpty(); } |
108 | 123 |
| 124 void set_show_shadow(bool show) { |
| 125 show_shadow_ = show; |
| 126 } |
| 127 |
109 private: | 128 private: |
110 virtual ~OverscrollWindowDelegate() {} | 129 virtual ~OverscrollWindowDelegate() {} |
111 | 130 |
112 aura::Window* web_contents_window() { | 131 aura::Window* web_contents_window() { |
113 return web_contents_->GetView()->GetContentNativeView(); | 132 return web_contents_->GetView()->GetContentNativeView(); |
114 } | 133 } |
115 | 134 |
116 // aura::WindowDelegate implementation: | 135 // aura::WindowDelegate implementation: |
117 virtual gfx::Size GetMinimumSize() const OVERRIDE { | 136 virtual gfx::Size GetMinimumSize() const OVERRIDE { |
118 return gfx::Size(); | 137 return gfx::Size(); |
(...skipping 22 matching lines...) Expand all Loading... |
141 } | 160 } |
142 | 161 |
143 virtual bool CanFocus() OVERRIDE { | 162 virtual bool CanFocus() OVERRIDE { |
144 return false; | 163 return false; |
145 } | 164 } |
146 | 165 |
147 virtual void OnCaptureLost() OVERRIDE { | 166 virtual void OnCaptureLost() OVERRIDE { |
148 } | 167 } |
149 | 168 |
150 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { | 169 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { |
| 170 if (show_shadow_) { |
| 171 canvas->Save(); |
| 172 canvas->Translate(gfx::Vector2d(kShadowThick, 0)); |
| 173 } |
151 if (image_.IsEmpty()) | 174 if (image_.IsEmpty()) |
152 canvas->DrawColor(SK_ColorGRAY); | 175 canvas->DrawColor(SK_ColorGRAY); |
153 else | 176 else |
154 canvas->DrawImageInt(image_.AsImageSkia(), 0, 0); | 177 canvas->DrawImageInt(image_.AsImageSkia(), 0, 0); |
| 178 |
| 179 if (show_shadow_) { |
| 180 canvas->Restore(); |
| 181 SkPoint points[2]; |
| 182 points[0].iset(0, 0); |
| 183 points[1].iset(kShadowThick, 0); |
| 184 SkColor colors[2] = { kShadowLightColor, kShadowDarkColor }; |
| 185 skia::RefPtr<SkShader> shader = skia::AdoptRef( |
| 186 SkGradientShader::CreateLinear(points, colors, NULL, |
| 187 arraysize(points), SkShader::kRepeat_TileMode, NULL)); |
| 188 |
| 189 SkRect rect = { SkIntToScalar(0), |
| 190 SkIntToScalar(0), |
| 191 SkIntToScalar(kShadowThick), |
| 192 SkIntToScalar(web_contents_window()->bounds().height()) }; |
| 193 SkPaint paint; |
| 194 paint.setShader(shader.get()); |
| 195 canvas->sk_canvas()->drawRect(rect, paint); |
| 196 } |
155 } | 197 } |
156 | 198 |
157 virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE { | 199 virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE { |
158 } | 200 } |
159 | 201 |
160 virtual void OnWindowDestroying() OVERRIDE { | 202 virtual void OnWindowDestroying() OVERRIDE { |
161 } | 203 } |
162 | 204 |
163 virtual void OnWindowDestroyed() OVERRIDE { | 205 virtual void OnWindowDestroyed() OVERRIDE { |
164 delete this; | 206 delete this; |
(...skipping 19 matching lines...) Expand all Loading... |
184 web_contents_window()->delegate()->OnScrollEvent(event); | 226 web_contents_window()->delegate()->OnScrollEvent(event); |
185 } | 227 } |
186 | 228 |
187 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { | 229 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { |
188 if (web_contents_window()) | 230 if (web_contents_window()) |
189 web_contents_window()->delegate()->OnGestureEvent(event); | 231 web_contents_window()->delegate()->OnGestureEvent(event); |
190 } | 232 } |
191 | 233 |
192 WebContents* web_contents_; | 234 WebContents* web_contents_; |
193 gfx::Image image_; | 235 gfx::Image image_; |
| 236 bool show_shadow_; |
194 | 237 |
195 DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate); | 238 DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate); |
196 }; | 239 }; |
197 | 240 |
198 // Listens to all mouse drag events during a drag and drop and sends them to | 241 // Listens to all mouse drag events during a drag and drop and sends them to |
199 // the renderer. | 242 // the renderer. |
200 class WebDragSourceAura : public MessageLoopForUI::Observer, | 243 class WebDragSourceAura : public MessageLoopForUI::Observer, |
201 public NotificationObserver { | 244 public NotificationObserver { |
202 public: | 245 public: |
203 WebDragSourceAura(aura::Window* window, WebContentsImpl* contents) | 246 WebDragSourceAura(aura::Window* window, WebContentsImpl* contents) |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 // Start resisting after the threshold. | 439 // Start resisting after the threshold. |
397 int resisted = threshold / 2; | 440 int resisted = threshold / 2; |
398 float extra = scroll - threshold; | 441 float extra = scroll - threshold; |
399 while ((extra /= 1.3f) > 1.f) | 442 while ((extra /= 1.3f) > 1.f) |
400 resisted += 1; | 443 resisted += 1; |
401 return resisted; | 444 return resisted; |
402 } | 445 } |
403 | 446 |
404 } // namespace | 447 } // namespace |
405 | 448 |
| 449 // ShadowWindow is used to paint shadows around a content window. |
| 450 // A ShadowWindow destroys itself when the content window is destroyed, and |
| 451 // updates its bounds to make sure the shadows are painted in the correct size. |
| 452 class ShadowWindow : public aura::Window, |
| 453 public aura::WindowObserver { |
| 454 public: |
| 455 explicit ShadowWindow(aura::Window* window) |
| 456 : aura::Window(NULL), |
| 457 window_(window), |
| 458 edge_(SHADOW_NONE) { |
| 459 SetType(aura::client::WINDOW_TYPE_CONTROL); |
| 460 SetTransparent(true); |
| 461 set_owned_by_parent(false); |
| 462 Init(ui::LAYER_NOT_DRAWN); |
| 463 layer()->SetMasksToBounds(false); |
| 464 |
| 465 AddChild(window); |
| 466 window_->AddObserver(this); |
| 467 |
| 468 SetBounds(gfx::Rect(window->bounds().size())); |
| 469 Show(); |
| 470 } |
| 471 |
| 472 void SetShadowEdge(ShadowEdge edge) { |
| 473 edge_ = edge; |
| 474 if (edge_ == SHADOW_NONE) { |
| 475 shadow_.reset(); |
| 476 return; |
| 477 } |
| 478 |
| 479 shadow_.reset(new ui::Layer(ui::LAYER_TEXTURED)); |
| 480 shadow_->set_delegate(this); |
| 481 shadow_->SetFillsBoundsOpaquely(false); |
| 482 layer()->Add(shadow_.get()); |
| 483 layer()->StackBelow(shadow_.get(), window_->layer()); |
| 484 UpdateShadowBounds(); |
| 485 } |
| 486 |
| 487 private: |
| 488 friend class base::DeleteHelper<content::ShadowWindow>; |
| 489 |
| 490 virtual ~ShadowWindow() { |
| 491 } |
| 492 |
| 493 void UpdateShadowBounds() { |
| 494 if (!shadow_.get()) |
| 495 return; |
| 496 gfx::Rect bound; |
| 497 switch (edge_) { |
| 498 case SHADOW_LEFT: |
| 499 bound.SetRect(-kShadowThick, 0, kShadowThick, bounds().height()); |
| 500 break; |
| 501 case SHADOW_RIGHT: |
| 502 bound.SetRect(bounds().right(), 0, kShadowThick, bounds().height()); |
| 503 break; |
| 504 case SHADOW_TOP: |
| 505 bound.SetRect(0, -kShadowThick, bounds().width(), kShadowThick); |
| 506 break; |
| 507 case SHADOW_BOTTOM: |
| 508 bound.SetRect(0, bounds().bottom(), bounds().width(), kShadowThick); |
| 509 break; |
| 510 case SHADOW_NONE: |
| 511 NOTREACHED(); |
| 512 } |
| 513 shadow_->SetBounds(bound); |
| 514 } |
| 515 |
| 516 // Overridden from aura::WindowObserver: |
| 517 virtual void OnWindowBoundsChanged(Window* window, |
| 518 const gfx::Rect& old_bounds, |
| 519 const gfx::Rect& new_bounds) OVERRIDE { |
| 520 SetBounds(gfx::Rect(new_bounds.size())); |
| 521 UpdateShadowBounds(); |
| 522 } |
| 523 |
| 524 virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { |
| 525 DCHECK_EQ(window, window_); |
| 526 window_->RemoveObserver(this); |
| 527 window_ = NULL; |
| 528 MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
| 529 } |
| 530 |
| 531 // Overridden from ui::LayerDelegate: |
| 532 virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE { |
| 533 SkPoint points[2]; |
| 534 SkColor colors[2]; |
| 535 |
| 536 points[0].iset(0, 0); |
| 537 switch (edge_) { |
| 538 case SHADOW_LEFT: |
| 539 case SHADOW_RIGHT: |
| 540 points[1].iset(shadow_->bounds().width(), 0); |
| 541 break; |
| 542 |
| 543 case SHADOW_TOP: |
| 544 case SHADOW_BOTTOM: |
| 545 points[1].iset(0, shadow_->bounds().height()); |
| 546 break; |
| 547 |
| 548 default: |
| 549 NOTREACHED(); |
| 550 } |
| 551 |
| 552 switch (edge_) { |
| 553 case SHADOW_LEFT: |
| 554 case SHADOW_TOP: |
| 555 colors[0] = kShadowLightColor; |
| 556 colors[1] = kShadowDarkColor; |
| 557 break; |
| 558 |
| 559 case SHADOW_RIGHT: |
| 560 case SHADOW_BOTTOM: |
| 561 colors[0] = kShadowDarkColor; |
| 562 colors[1] = kShadowLightColor; |
| 563 break; |
| 564 |
| 565 default: |
| 566 NOTREACHED(); |
| 567 } |
| 568 |
| 569 skia::RefPtr<SkShader> shader = skia::AdoptRef( |
| 570 SkGradientShader::CreateLinear(points, colors, NULL, |
| 571 arraysize(points), SkShader::kRepeat_TileMode, NULL)); |
| 572 |
| 573 SkPaint paint; |
| 574 paint.setShader(shader.get()); |
| 575 canvas->sk_canvas()->drawRect(gfx::RectToSkRect(bounds()), paint); |
| 576 } |
| 577 |
| 578 aura::Window* window_; |
| 579 scoped_ptr<ui::Layer> shadow_; |
| 580 ShadowEdge edge_; |
| 581 |
| 582 DISALLOW_COPY_AND_ASSIGN(ShadowWindow); |
| 583 }; |
| 584 |
406 // When a history navigation is triggered at the end of an overscroll | 585 // When a history navigation is triggered at the end of an overscroll |
407 // navigation, it is necessary to show the history-screenshot until the page is | 586 // navigation, it is necessary to show the history-screenshot until the page is |
408 // done navigating and painting. This class accomplishes this by showing the | 587 // done navigating and painting. This class accomplishes this by showing the |
409 // screenshot window on top of the page until the page has completed loading and | 588 // screenshot window on top of the page until the page has completed loading and |
410 // painting. | 589 // painting. |
411 class OverscrollNavigationOverlay : | 590 class OverscrollNavigationOverlay : |
412 public RenderWidgetHostViewAura::PaintObserver { | 591 public RenderWidgetHostViewAura::PaintObserver { |
413 public: | 592 public: |
414 OverscrollNavigationOverlay() | 593 OverscrollNavigationOverlay() |
415 : view_(NULL), | 594 : view_(NULL), |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 // WebContentsViewAura, public: | 745 // WebContentsViewAura, public: |
567 | 746 |
568 WebContentsViewAura::WebContentsViewAura( | 747 WebContentsViewAura::WebContentsViewAura( |
569 WebContentsImpl* web_contents, | 748 WebContentsImpl* web_contents, |
570 WebContentsViewDelegate* delegate) | 749 WebContentsViewDelegate* delegate) |
571 : web_contents_(web_contents), | 750 : web_contents_(web_contents), |
572 delegate_(delegate), | 751 delegate_(delegate), |
573 current_drag_op_(WebKit::WebDragOperationNone), | 752 current_drag_op_(WebKit::WebDragOperationNone), |
574 drag_dest_delegate_(NULL), | 753 drag_dest_delegate_(NULL), |
575 current_rvh_for_drag_(NULL), | 754 current_rvh_for_drag_(NULL), |
| 755 content_container_(NULL), |
576 overscroll_change_brightness_(false), | 756 overscroll_change_brightness_(false), |
577 current_overscroll_gesture_(OVERSCROLL_NONE), | 757 current_overscroll_gesture_(OVERSCROLL_NONE), |
578 completed_overscroll_gesture_(OVERSCROLL_NONE) { | 758 completed_overscroll_gesture_(OVERSCROLL_NONE) { |
579 } | 759 } |
580 | 760 |
581 //////////////////////////////////////////////////////////////////////////////// | 761 //////////////////////////////////////////////////////////////////////////////// |
582 // WebContentsViewAura, private: | 762 // WebContentsViewAura, private: |
583 | 763 |
584 WebContentsViewAura::~WebContentsViewAura() { | 764 WebContentsViewAura::~WebContentsViewAura() { |
585 if (!window_) | 765 if (!window_) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 base::AutoReset<OverscrollMode> reset_state(¤t_overscroll_gesture_, | 802 base::AutoReset<OverscrollMode> reset_state(¤t_overscroll_gesture_, |
623 current_overscroll_gesture_); | 803 current_overscroll_gesture_); |
624 scoped_ptr<aura::Window> reset_window(overscroll_window_.release()); | 804 scoped_ptr<aura::Window> reset_window(overscroll_window_.release()); |
625 } | 805 } |
626 | 806 |
627 OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate( | 807 OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate( |
628 web_contents_, | 808 web_contents_, |
629 current_overscroll_gesture_); | 809 current_overscroll_gesture_); |
630 overscroll_window_.reset(new aura::Window(overscroll_delegate)); | 810 overscroll_window_.reset(new aura::Window(overscroll_delegate)); |
631 overscroll_window_->SetType(aura::client::WINDOW_TYPE_CONTROL); | 811 overscroll_window_->SetType(aura::client::WINDOW_TYPE_CONTROL); |
632 overscroll_window_->SetTransparent(false); | 812 overscroll_window_->SetTransparent(true); |
633 overscroll_window_->Init(ui::LAYER_TEXTURED); | 813 overscroll_window_->Init(ui::LAYER_TEXTURED); |
634 overscroll_window_->layer()->SetMasksToBounds(true); | 814 overscroll_window_->layer()->SetMasksToBounds(true); |
635 overscroll_window_->SetName("OverscrollOverlay"); | 815 overscroll_window_->SetName("OverscrollOverlay"); |
636 | 816 |
637 overscroll_change_brightness_ = overscroll_delegate->has_screenshot(); | 817 overscroll_change_brightness_ = overscroll_delegate->has_screenshot(); |
638 window_->AddChild(overscroll_window_.get()); | 818 window_->AddChild(overscroll_window_.get()); |
639 | 819 |
640 gfx::Rect bounds = gfx::Rect(window_->bounds().size()); | 820 gfx::Rect bounds = gfx::Rect(window_->bounds().size()); |
641 if (ShouldNavigateForward(web_contents_->GetController(), | 821 if (ShouldNavigateForward(web_contents_->GetController(), |
642 current_overscroll_gesture_)) { | 822 current_overscroll_gesture_)) { |
643 // The overlay will be sliding in from the right edge towards the left in | 823 // The overlay will be sliding in from the right edge towards the left in |
644 // non-RTL, or sliding in from the left edge towards the right in RTL. | 824 // non-RTL, or sliding in from the left edge towards the right in RTL. |
645 // So position the overlay window accordingly. | 825 // So position the overlay window accordingly. |
646 bounds.Offset(base::i18n::IsRTL() ? -bounds.width() : bounds.width(), 0); | 826 bounds.Offset(base::i18n::IsRTL() ? -bounds.width() : bounds.width(), 0); |
647 } | 827 } |
648 | 828 |
649 if (GetWindowToAnimateForOverscroll() == overscroll_window_.get()) | 829 if (GetWindowToAnimateForOverscroll() == overscroll_window_.get()) { |
650 window_->StackChildAbove(overscroll_window_.get(), GetContentNativeView()); | 830 overscroll_delegate->set_show_shadow(true); |
651 else | 831 window_->StackChildAbove(overscroll_window_.get(), content_container_); |
652 window_->StackChildBelow(overscroll_window_.get(), GetContentNativeView()); | 832 } else { |
| 833 window_->StackChildBelow(overscroll_window_.get(), content_container_); |
| 834 |
| 835 switch (current_overscroll_gesture_) { |
| 836 case OVERSCROLL_EAST: |
| 837 content_container_->SetShadowEdge(SHADOW_LEFT); |
| 838 break; |
| 839 |
| 840 case OVERSCROLL_WEST: |
| 841 content_container_->SetShadowEdge(SHADOW_RIGHT); |
| 842 break; |
| 843 |
| 844 case OVERSCROLL_NORTH: |
| 845 content_container_->SetShadowEdge(SHADOW_BOTTOM); |
| 846 break; |
| 847 |
| 848 case OVERSCROLL_SOUTH: |
| 849 content_container_->SetShadowEdge(SHADOW_TOP); |
| 850 break; |
| 851 |
| 852 case OVERSCROLL_NONE: |
| 853 case OVERSCROLL_COUNT: |
| 854 NOTREACHED(); |
| 855 } |
| 856 } |
653 | 857 |
654 UpdateOverscrollWindowBrightness(0.f); | 858 UpdateOverscrollWindowBrightness(0.f); |
655 | 859 |
656 overscroll_window_->SetBounds(bounds); | 860 overscroll_window_->SetBounds(bounds); |
657 overscroll_window_->Show(); | 861 overscroll_window_->Show(); |
658 } | 862 } |
659 | 863 |
660 void WebContentsViewAura::PrepareContentWindowForOverscroll() { | 864 void WebContentsViewAura::PrepareContentWindowForOverscroll() { |
661 aura::Window* content = GetContentNativeView(); | 865 aura::Window* content = content_container_; |
662 if (!content) | 866 if (!content) |
663 return; | 867 return; |
664 | 868 |
665 ui::ScopedLayerAnimationSettings settings(content->layer()->GetAnimator()); | 869 ui::ScopedLayerAnimationSettings settings(content->layer()->GetAnimator()); |
666 settings.SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET); | 870 settings.SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET); |
667 content->SetTransform(gfx::Transform()); | 871 content->SetTransform(gfx::Transform()); |
668 content->layer()->SetLayerBrightness(0.f); | 872 content->layer()->SetLayerBrightness(0.f); |
669 } | 873 } |
670 | 874 |
671 void WebContentsViewAura::ResetOverscrollTransform() { | 875 void WebContentsViewAura::ResetOverscrollTransform() { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 target->SetTransform(transform); | 922 target->SetTransform(transform); |
719 UpdateOverscrollWindowBrightness(translate_x); | 923 UpdateOverscrollWindowBrightness(translate_x); |
720 } | 924 } |
721 | 925 |
722 aura::Window* WebContentsViewAura::GetWindowToAnimateForOverscroll() { | 926 aura::Window* WebContentsViewAura::GetWindowToAnimateForOverscroll() { |
723 if (current_overscroll_gesture_ == OVERSCROLL_NONE) | 927 if (current_overscroll_gesture_ == OVERSCROLL_NONE) |
724 return NULL; | 928 return NULL; |
725 | 929 |
726 return ShouldNavigateForward(web_contents_->GetController(), | 930 return ShouldNavigateForward(web_contents_->GetController(), |
727 current_overscroll_gesture_) ? | 931 current_overscroll_gesture_) ? |
728 overscroll_window_.get() : GetContentNativeView(); | 932 overscroll_window_.get() : content_container_; |
729 } | 933 } |
730 | 934 |
731 gfx::Vector2d WebContentsViewAura::GetTranslationForOverscroll(int delta_x, | 935 gfx::Vector2d WebContentsViewAura::GetTranslationForOverscroll(int delta_x, |
732 int delta_y) { | 936 int delta_y) { |
733 if (current_overscroll_gesture_ == OVERSCROLL_NORTH || | 937 if (current_overscroll_gesture_ == OVERSCROLL_NORTH || |
734 current_overscroll_gesture_ == OVERSCROLL_SOUTH) { | 938 current_overscroll_gesture_ == OVERSCROLL_SOUTH) { |
735 // For vertical overscroll, always do a resisted drag. | 939 // For vertical overscroll, always do a resisted drag. |
736 const float threshold = GetOverscrollConfig( | 940 const float threshold = GetOverscrollConfig( |
737 OVERSCROLL_CONFIG_VERT_RESIST_AFTER); | 941 OVERSCROLL_CONFIG_VERT_RESIST_AFTER); |
738 int scroll = GetResistedScrollAmount(abs(delta_y), | 942 int scroll = GetResistedScrollAmount(abs(delta_y), |
(...skipping 11 matching lines...) Expand all Loading... |
750 return gfx::Vector2d(std::min(bounds.width(), delta_x), 0); | 954 return gfx::Vector2d(std::min(bounds.width(), delta_x), 0); |
751 | 955 |
752 const float threshold = GetOverscrollConfig( | 956 const float threshold = GetOverscrollConfig( |
753 OVERSCROLL_CONFIG_HORIZ_RESIST_AFTER); | 957 OVERSCROLL_CONFIG_HORIZ_RESIST_AFTER); |
754 int scroll = GetResistedScrollAmount(abs(delta_x), | 958 int scroll = GetResistedScrollAmount(abs(delta_x), |
755 static_cast<int>(threshold)); | 959 static_cast<int>(threshold)); |
756 return gfx::Vector2d(delta_x < 0 ? -scroll : scroll, 0); | 960 return gfx::Vector2d(delta_x < 0 ? -scroll : scroll, 0); |
757 } | 961 } |
758 | 962 |
759 void WebContentsViewAura::PrepareOverscrollNavigationOverlay() { | 963 void WebContentsViewAura::PrepareOverscrollNavigationOverlay() { |
| 964 OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( |
| 965 overscroll_window_->delegate()); |
| 966 delegate->set_show_shadow(false); |
| 967 overscroll_window_->SchedulePaintInRect( |
| 968 gfx::Rect(overscroll_window_->bounds().size())); |
760 navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass()); | 969 navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass()); |
761 navigation_overlay_->StartObservingView(static_cast< | 970 navigation_overlay_->StartObservingView(static_cast< |
762 RenderWidgetHostViewAura*>(web_contents_->GetRenderWidgetHostView())); | 971 RenderWidgetHostViewAura*>(web_contents_->GetRenderWidgetHostView())); |
763 } | 972 } |
764 | 973 |
765 void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) { | 974 void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) { |
766 if (!overscroll_change_brightness_) | 975 if (!overscroll_change_brightness_) |
767 return; | 976 return; |
768 | 977 |
769 const float kBrightnessMin = -.5f; | 978 const float kBrightnessMin = -.5f; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 // this actually is happening (and somebody isn't accidentally creating the | 1037 // this actually is happening (and somebody isn't accidentally creating the |
829 // view twice), we check for the RVH Factory, which will be set when we're | 1038 // view twice), we check for the RVH Factory, which will be set when we're |
830 // making special ones (which go along with the special views). | 1039 // making special ones (which go along with the special views). |
831 DCHECK(RenderViewHostFactory::has_factory()); | 1040 DCHECK(RenderViewHostFactory::has_factory()); |
832 return render_widget_host->GetView(); | 1041 return render_widget_host->GetView(); |
833 } | 1042 } |
834 | 1043 |
835 RenderWidgetHostView* view = | 1044 RenderWidgetHostView* view = |
836 RenderWidgetHostView::CreateViewForWidget(render_widget_host); | 1045 RenderWidgetHostView::CreateViewForWidget(render_widget_host); |
837 view->InitAsChild(NULL); | 1046 view->InitAsChild(NULL); |
838 GetNativeView()->AddChild(view->GetNativeView()); | 1047 content_container_ = new ShadowWindow(view->GetNativeView()); |
| 1048 GetNativeView()->AddChild(content_container_); |
839 | 1049 |
840 if (navigation_overlay_.get() && navigation_overlay_->has_window()) { | 1050 if (navigation_overlay_.get() && navigation_overlay_->has_window()) { |
841 navigation_overlay_->StartObservingView(static_cast< | 1051 navigation_overlay_->StartObservingView(static_cast< |
842 RenderWidgetHostViewAura*>(view)); | 1052 RenderWidgetHostViewAura*>(view)); |
843 } | 1053 } |
844 | 1054 |
845 view->Show(); | 1055 view->Show(); |
846 | 1056 |
847 // We listen to drag drop events in the newly created view's window. | 1057 // We listen to drag drop events in the newly created view's window. |
848 aura::client::SetDragDropDelegate(view->GetNativeView(), this); | 1058 aura::client::SetDragDropDelegate(view->GetNativeView(), this); |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1098 completed_overscroll_gesture_)) { | 1308 completed_overscroll_gesture_)) { |
1099 PrepareOverscrollNavigationOverlay(); | 1309 PrepareOverscrollNavigationOverlay(); |
1100 web_contents_->GetController().GoForward(); | 1310 web_contents_->GetController().GoForward(); |
1101 } else if (ShouldNavigateBack(web_contents_->GetController(), | 1311 } else if (ShouldNavigateBack(web_contents_->GetController(), |
1102 completed_overscroll_gesture_)) { | 1312 completed_overscroll_gesture_)) { |
1103 PrepareOverscrollNavigationOverlay(); | 1313 PrepareOverscrollNavigationOverlay(); |
1104 web_contents_->GetController().GoBack(); | 1314 web_contents_->GetController().GoBack(); |
1105 } | 1315 } |
1106 | 1316 |
1107 if (GetContentNativeView()) { | 1317 if (GetContentNativeView()) { |
1108 GetContentNativeView()->SetTransform(gfx::Transform()); | 1318 content_container_->SetTransform(gfx::Transform()); |
1109 GetContentNativeView()->layer()->SetLayerBrightness(0.f); | 1319 content_container_->layer()->SetLayerBrightness(0.f); |
| 1320 content_container_->SetShadowEdge(SHADOW_NONE); |
1110 } | 1321 } |
1111 current_overscroll_gesture_ = OVERSCROLL_NONE; | 1322 current_overscroll_gesture_ = OVERSCROLL_NONE; |
1112 completed_overscroll_gesture_ = OVERSCROLL_NONE; | 1323 completed_overscroll_gesture_ = OVERSCROLL_NONE; |
1113 overscroll_window_.reset(); | 1324 overscroll_window_.reset(); |
1114 } | 1325 } |
1115 | 1326 |
1116 //////////////////////////////////////////////////////////////////////////////// | 1327 //////////////////////////////////////////////////////////////////////////////// |
1117 // WebContentsViewAura, aura::WindowDelegate implementation: | 1328 // WebContentsViewAura, aura::WindowDelegate implementation: |
1118 | 1329 |
1119 gfx::Size WebContentsViewAura::GetMinimumSize() const { | 1330 gfx::Size WebContentsViewAura::GetMinimumSize() const { |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1296 event.location(), | 1507 event.location(), |
1297 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), | 1508 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), |
1298 ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); | 1509 ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); |
1299 if (drag_dest_delegate_) | 1510 if (drag_dest_delegate_) |
1300 drag_dest_delegate_->OnDrop(); | 1511 drag_dest_delegate_->OnDrop(); |
1301 current_drop_data_.reset(); | 1512 current_drop_data_.reset(); |
1302 return current_drag_op_; | 1513 return current_drag_op_; |
1303 } | 1514 } |
1304 | 1515 |
1305 } // namespace content | 1516 } // namespace content |
OLD | NEW |