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

Side by Side Diff: sky/engine/web/WebViewImpl.cpp

Issue 872233002: Switch KeyboardEvents over to NewEventHandler (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: nits Created 5 years, 11 months 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 #include "sky/engine/core/page/Chrome.h" 57 #include "sky/engine/core/page/Chrome.h"
58 #include "sky/engine/core/page/EventHandler.h" 58 #include "sky/engine/core/page/EventHandler.h"
59 #include "sky/engine/core/page/EventWithHitTestResults.h" 59 #include "sky/engine/core/page/EventWithHitTestResults.h"
60 #include "sky/engine/core/page/FocusController.h" 60 #include "sky/engine/core/page/FocusController.h"
61 #include "sky/engine/core/page/Page.h" 61 #include "sky/engine/core/page/Page.h"
62 #include "sky/engine/core/rendering/RenderView.h" 62 #include "sky/engine/core/rendering/RenderView.h"
63 #include "sky/engine/platform/Cursor.h" 63 #include "sky/engine/platform/Cursor.h"
64 #include "sky/engine/platform/KeyboardCodes.h" 64 #include "sky/engine/platform/KeyboardCodes.h"
65 #include "sky/engine/platform/Logging.h" 65 #include "sky/engine/platform/Logging.h"
66 #include "sky/engine/platform/NotImplemented.h" 66 #include "sky/engine/platform/NotImplemented.h"
67 #include "sky/engine/platform/PlatformKeyboardEvent.h"
68 #include "sky/engine/platform/TraceEvent.h" 67 #include "sky/engine/platform/TraceEvent.h"
69 #include "sky/engine/platform/fonts/FontCache.h" 68 #include "sky/engine/platform/fonts/FontCache.h"
70 #include "sky/engine/platform/graphics/Color.h" 69 #include "sky/engine/platform/graphics/Color.h"
71 #include "sky/engine/platform/graphics/GraphicsContext.h" 70 #include "sky/engine/platform/graphics/GraphicsContext.h"
72 #include "sky/engine/platform/graphics/Image.h" 71 #include "sky/engine/platform/graphics/Image.h"
73 #include "sky/engine/platform/graphics/ImageBuffer.h" 72 #include "sky/engine/platform/graphics/ImageBuffer.h"
74 #include "sky/engine/platform/scroll/Scrollbar.h" 73 #include "sky/engine/platform/scroll/Scrollbar.h"
75 #include "sky/engine/public/platform/Platform.h" 74 #include "sky/engine/public/platform/Platform.h"
76 #include "sky/engine/public/platform/WebFloatPoint.h" 75 #include "sky/engine/public/platform/WebFloatPoint.h"
77 #include "sky/engine/public/platform/WebImage.h" 76 #include "sky/engine/public/platform/WebImage.h"
78 #include "sky/engine/public/platform/WebLayerTreeView.h" 77 #include "sky/engine/public/platform/WebLayerTreeView.h"
79 #include "sky/engine/public/platform/WebURLRequest.h" 78 #include "sky/engine/public/platform/WebURLRequest.h"
80 #include "sky/engine/public/platform/WebVector.h" 79 #include "sky/engine/public/platform/WebVector.h"
81 #include "sky/engine/public/web/WebBeginFrameArgs.h" 80 #include "sky/engine/public/web/WebBeginFrameArgs.h"
82 #include "sky/engine/public/web/WebFrameClient.h" 81 #include "sky/engine/public/web/WebFrameClient.h"
83 #include "sky/engine/public/web/WebHitTestResult.h" 82 #include "sky/engine/public/web/WebHitTestResult.h"
84 #include "sky/engine/public/web/WebNode.h" 83 #include "sky/engine/public/web/WebNode.h"
85 #include "sky/engine/public/web/WebRange.h" 84 #include "sky/engine/public/web/WebRange.h"
86 #include "sky/engine/public/web/WebTextInputInfo.h" 85 #include "sky/engine/public/web/WebTextInputInfo.h"
87 #include "sky/engine/public/web/WebViewClient.h" 86 #include "sky/engine/public/web/WebViewClient.h"
88 #include "sky/engine/web/CompositionUnderlineVectorBuilder.h" 87 #include "sky/engine/web/CompositionUnderlineVectorBuilder.h"
89 #include "sky/engine/web/WebInputEventConversion.h"
90 #include "sky/engine/web/WebLocalFrameImpl.h" 88 #include "sky/engine/web/WebLocalFrameImpl.h"
91 #include "sky/engine/web/WebSettingsImpl.h" 89 #include "sky/engine/web/WebSettingsImpl.h"
92 #include "sky/engine/wtf/CurrentTime.h" 90 #include "sky/engine/wtf/CurrentTime.h"
93 #include "sky/engine/wtf/RefPtr.h" 91 #include "sky/engine/wtf/RefPtr.h"
94 #include "sky/engine/wtf/TemporaryChange.h" 92 #include "sky/engine/wtf/TemporaryChange.h"
95 93
96 // Get rid of WTF's pow define so we can use std::pow. 94 // Get rid of WTF's pow define so we can use std::pow.
97 #undef pow 95 #undef pow
98 #include <cmath> // for std::pow 96 #include <cmath> // for std::pow
99 97
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 } 182 }
185 183
186 void WebViewImpl::acceptLanguagesChanged() 184 void WebViewImpl::acceptLanguagesChanged()
187 { 185 {
188 if (!page()) 186 if (!page())
189 return; 187 return;
190 188
191 page()->acceptLanguagesChanged(); 189 page()->acceptLanguagesChanged();
192 } 190 }
193 191
194 bool WebViewImpl::handleKeyEvent(const WebKeyboardEvent& event)
195 {
196 ASSERT((event.type == WebInputEvent::RawKeyDown)
197 || (event.type == WebInputEvent::KeyDown)
198 || (event.type == WebInputEvent::KeyUp));
199
200 // Please refer to the comments explaining the m_suppressNextKeypressEvent
201 // member.
202 // The m_suppressNextKeypressEvent is set if the KeyDown is handled by
203 // Webkit. A keyDown event is typically associated with a keyPress(char)
204 // event and a keyUp event. We reset this flag here as this is a new keyDown
205 // event.
206 m_suppressNextKeypressEvent = false;
207
208 RefPtr<LocalFrame> focusedFrame = focusedCoreFrame();
209 if (!focusedFrame)
210 return false;
211
212 RefPtr<LocalFrame> frame = focusedFrame.get();
213
214 PlatformKeyboardEventBuilder evt(event);
215
216 if (frame->eventHandler().keyEvent(evt)) {
217 if (WebInputEvent::RawKeyDown == event.type) {
218 // Suppress the next keypress event unless the focused node is a plu g-in node.
219 // (Flash needs these keypress events to handle non-US keyboards.)
220 m_suppressNextKeypressEvent = true;
221 }
222 return true;
223 }
224
225 return keyEventDefault(event);
226 }
227
228 bool WebViewImpl::handleCharEvent(const WebKeyboardEvent& event)
229 {
230 ASSERT(event.type == WebInputEvent::Char);
231
232 // Please refer to the comments explaining the m_suppressNextKeypressEvent
233 // member. The m_suppressNextKeypressEvent is set if the KeyDown is
234 // handled by Webkit. A keyDown event is typically associated with a
235 // keyPress(char) event and a keyUp event. We reset this flag here as it
236 // only applies to the current keyPress event.
237 bool suppress = m_suppressNextKeypressEvent;
238 m_suppressNextKeypressEvent = false;
239
240 LocalFrame* frame = focusedCoreFrame();
241 if (!frame)
242 return suppress;
243
244 EventHandler& handler = frame->eventHandler();
245
246 PlatformKeyboardEventBuilder evt(event);
247 if (!evt.isCharacterKey())
248 return true;
249
250 // Safari 3.1 does not pass off windows system key messages (WM_SYSCHAR) to
251 // the eventHandler::keyEvent. We mimic this behavior on all platforms since
252 // for now we are converting other platform's key events to windows key
253 // events.
254 if (evt.isSystemKey())
255 return false;
256
257 if (!suppress && !handler.keyEvent(evt))
258 return keyEventDefault(event);
259
260 return true;
261 }
262
263 bool WebViewImpl::keyEventDefault(const WebKeyboardEvent& event)
264 {
265 LocalFrame* frame = focusedCoreFrame();
266 if (!frame)
267 return false;
268
269 switch (event.type) {
270 case WebInputEvent::Char:
271 if (event.windowsKeyCode == VKEY_SPACE) {
272 int keyCode = ((event.modifiers & WebInputEvent::ShiftKey) ? VKEY_PR IOR : VKEY_NEXT);
273 return scrollViewWithKeyboard(keyCode, event.modifiers);
274 }
275 break;
276 case WebInputEvent::RawKeyDown:
277 if (event.modifiers == WebInputEvent::ControlKey) {
278 switch (event.windowsKeyCode) {
279 // Match FF behavior in the sense that Ctrl+home/end are the only Ct rl
280 // key combinations which affect scrolling. Safari is buggy in the
281 // sense that it scrolls the page for all Ctrl+scrolling key
282 // combinations. For e.g. Ctrl+pgup/pgdn/up/down, etc.
283 case VKEY_HOME:
284 case VKEY_END:
285 break;
286 default:
287 return false;
288 }
289 }
290 if (!event.isSystemKey && !(event.modifiers & WebInputEvent::ShiftKey))
291 return scrollViewWithKeyboard(event.windowsKeyCode, event.modifiers) ;
292 break;
293 default:
294 break;
295 }
296 return false;
297 }
298
299 bool WebViewImpl::scrollViewWithKeyboard(int keyCode, int modifiers)
300 {
301 ScrollDirection scrollDirection;
302 ScrollGranularity scrollGranularity;
303 if (!mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity))
304 return false;
305
306 if (LocalFrame* frame = focusedCoreFrame())
307 return frame->eventHandler().bubblingScroll(scrollDirection, scrollGranu larity);
308 return false;
309 }
310
311 bool WebViewImpl::mapKeyCodeForScroll(
ojan 2015/01/26 06:18:51 This is another place where if we were to plug in
abarth-chromium 2015/01/26 06:28:16 I'd imagine we'd want to do this work in the frame
312 int keyCode,
313 ScrollDirection* scrollDirection,
314 ScrollGranularity* scrollGranularity)
315 {
316 switch (keyCode) {
317 case VKEY_LEFT:
318 *scrollDirection = ScrollLeft;
319 *scrollGranularity = ScrollByLine;
320 break;
321 case VKEY_RIGHT:
322 *scrollDirection = ScrollRight;
323 *scrollGranularity = ScrollByLine;
324 break;
325 case VKEY_UP:
326 *scrollDirection = ScrollUp;
327 *scrollGranularity = ScrollByLine;
328 break;
329 case VKEY_DOWN:
330 *scrollDirection = ScrollDown;
331 *scrollGranularity = ScrollByLine;
332 break;
333 case VKEY_HOME:
334 *scrollDirection = ScrollUp;
335 *scrollGranularity = ScrollByDocument;
336 break;
337 case VKEY_END:
338 *scrollDirection = ScrollDown;
339 *scrollGranularity = ScrollByDocument;
340 break;
341 case VKEY_PRIOR: // page up
342 *scrollDirection = ScrollUp;
343 *scrollGranularity = ScrollByPage;
344 break;
345 case VKEY_NEXT: // page down
346 *scrollDirection = ScrollDown;
347 *scrollGranularity = ScrollByPage;
348 break;
349 default:
350 return false;
351 }
352
353 return true;
354 }
355
356 LocalFrame* WebViewImpl::focusedCoreFrame() const 192 LocalFrame* WebViewImpl::focusedCoreFrame() const
357 { 193 {
358 return m_page ? m_page->focusController().focusedOrMainFrame() : 0; 194 return m_page ? m_page->focusController().focusedOrMainFrame() : 0;
359 } 195 }
360 196
361 WebViewImpl* WebViewImpl::fromPage(Page* page) 197 WebViewImpl* WebViewImpl::fromPage(Page* page)
362 { 198 {
363 if (!page) 199 if (!page)
364 return 0; 200 return 0;
365 return static_cast<WebViewImpl*>(page->chrome().client().webView()); 201 return static_cast<WebViewImpl*>(page->chrome().client().webView());
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 if (WebInputEvent::isPointerEventType(inputEvent.type)) { 330 if (WebInputEvent::isPointerEventType(inputEvent.type)) {
495 const WebPointerEvent& event = static_cast<const WebPointerEvent&>(input Event); 331 const WebPointerEvent& event = static_cast<const WebPointerEvent&>(input Event);
496 return m_page->mainFrame()->newEventHandler().handlePointerEvent(event); 332 return m_page->mainFrame()->newEventHandler().handlePointerEvent(event);
497 } 333 }
498 334
499 if (WebInputEvent::isGestureEventType(inputEvent.type)) { 335 if (WebInputEvent::isGestureEventType(inputEvent.type)) {
500 const WebGestureEvent& event = static_cast<const WebGestureEvent&>(input Event); 336 const WebGestureEvent& event = static_cast<const WebGestureEvent&>(input Event);
501 return m_page->mainFrame()->newEventHandler().handleGestureEvent(event); 337 return m_page->mainFrame()->newEventHandler().handleGestureEvent(event);
502 } 338 }
503 339
504 switch (inputEvent.type) { 340 if (WebInputEvent::isKeyboardEventType(inputEvent.type)) {
505 case WebInputEvent::RawKeyDown: 341 const WebKeyboardEvent& event = static_cast<const WebKeyboardEvent&>(inp utEvent);
506 case WebInputEvent::KeyDown: 342 return m_page->mainFrame()->newEventHandler().handleKeyboardEvent(event) ;
507 case WebInputEvent::KeyUp:
508 return handleKeyEvent(static_cast<const WebKeyboardEvent&>(inputEvent));
509 case WebInputEvent::Char:
510 return handleCharEvent(static_cast<const WebKeyboardEvent&>(inputEvent)) ;
511 default:
512 return false;
513 } 343 }
344
345 return false;
514 } 346 }
515 347
516 void WebViewImpl::setFocus(bool enable) 348 void WebViewImpl::setFocus(bool enable)
517 { 349 {
518 m_page->focusController().setFocused(enable); 350 m_page->focusController().setFocused(enable);
519 if (enable) { 351 if (enable) {
520 m_page->focusController().setActive(true); 352 m_page->focusController().setActive(true);
521 RefPtr<LocalFrame> focusedFrame = m_page->focusController().focusedFrame (); 353 RefPtr<LocalFrame> focusedFrame = m_page->focusController().focusedFrame ();
522 if (focusedFrame) { 354 if (focusedFrame) {
523 LocalFrame* localFrame = focusedFrame.get(); 355 LocalFrame* localFrame = focusedFrame.get();
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 void WebViewImpl::setVisibilityState(WebPageVisibilityState visibilityState, 899 void WebViewImpl::setVisibilityState(WebPageVisibilityState visibilityState,
1068 bool isInitialState) { 900 bool isInitialState) {
1069 if (!page()) 901 if (!page())
1070 return; 902 return;
1071 903
1072 ASSERT(visibilityState == WebPageVisibilityStateVisible || visibilityState = = WebPageVisibilityStateHidden); 904 ASSERT(visibilityState == WebPageVisibilityStateVisible || visibilityState = = WebPageVisibilityStateHidden);
1073 m_page->setVisibilityState(static_cast<PageVisibilityState>(static_cast<int> (visibilityState)), isInitialState); 905 m_page->setVisibilityState(static_cast<PageVisibilityState>(static_cast<int> (visibilityState)), isInitialState);
1074 } 906 }
1075 907
1076 } // namespace blink 908 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698