OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // Event management for WebViewInternal. | 5 // Event management for WebViewInternal. |
6 | 6 |
7 var DeclarativeWebRequestSchema = | 7 var DeclarativeWebRequestSchema = |
8 requireNative('schema_registry').GetSchema('declarativeWebRequest'); | 8 requireNative('schema_registry').GetSchema('declarativeWebRequest'); |
9 var EventBindings = require('event_bindings'); | 9 var EventBindings = require('event_bindings'); |
10 var IdGenerator = requireNative('id_generator'); | 10 var IdGenerator = requireNative('id_generator'); |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 var validateCall = function() { | 326 var validateCall = function() { |
327 var ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN = '<webview>: ' + | 327 var ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN = '<webview>: ' + |
328 'An action has already been taken for this "dialog" event.'; | 328 'An action has already been taken for this "dialog" event.'; |
329 | 329 |
330 if (actionTaken) { | 330 if (actionTaken) { |
331 throw new Error(ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN); | 331 throw new Error(ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN); |
332 } | 332 } |
333 actionTaken = true; | 333 actionTaken = true; |
334 }; | 334 }; |
335 | 335 |
336 var getInstanceId = function() { | 336 var getGuestInstanceId = function() { |
337 return self.webViewInternal.getInstanceId(); | 337 return self.webViewInternal.getGuestInstanceId(); |
338 }; | 338 }; |
339 | 339 |
340 var dialog = { | 340 var dialog = { |
341 ok: function(user_input) { | 341 ok: function(user_input) { |
342 validateCall(); | 342 validateCall(); |
343 user_input = user_input || ''; | 343 user_input = user_input || ''; |
344 WebView.setPermission(getInstanceId(), requestId, 'allow', user_input); | 344 WebView.setPermission(getGuestInstanceId(), requestId, 'allow', |
| 345 user_input); |
345 }, | 346 }, |
346 cancel: function() { | 347 cancel: function() { |
347 validateCall(); | 348 validateCall(); |
348 WebView.setPermission(getInstanceId(), requestId, 'deny'); | 349 WebView.setPermission(getGuestInstanceId(), requestId, 'deny'); |
349 } | 350 } |
350 }; | 351 }; |
351 webViewEvent.dialog = dialog; | 352 webViewEvent.dialog = dialog; |
352 | 353 |
353 var defaultPrevented = !self.webViewInternal.dispatchEvent(webViewEvent); | 354 var defaultPrevented = !self.webViewInternal.dispatchEvent(webViewEvent); |
354 if (actionTaken) { | 355 if (actionTaken) { |
355 return; | 356 return; |
356 } | 357 } |
357 | 358 |
358 if (defaultPrevented) { | 359 if (defaultPrevented) { |
359 // Tell the JavaScript garbage collector to track lifetime of |dialog| and | 360 // Tell the JavaScript garbage collector to track lifetime of |dialog| and |
360 // call back when the dialog object has been collected. | 361 // call back when the dialog object has been collected. |
361 MessagingNatives.BindToGC(dialog, function() { | 362 MessagingNatives.BindToGC(dialog, function() { |
362 // Avoid showing a warning message if the decision has already been made. | 363 // Avoid showing a warning message if the decision has already been made. |
363 if (actionTaken) { | 364 if (actionTaken) { |
364 return; | 365 return; |
365 } | 366 } |
366 WebView.setPermission( | 367 WebView.setPermission( |
367 getInstanceId(), requestId, 'default', '', function(allowed) { | 368 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
368 if (allowed) { | 369 if (allowed) { |
369 return; | 370 return; |
370 } | 371 } |
371 showWarningMessage(event.messageType); | 372 showWarningMessage(event.messageType); |
372 }); | 373 }); |
373 }); | 374 }); |
374 } else { | 375 } else { |
375 actionTaken = true; | 376 actionTaken = true; |
376 // The default action is equivalent to canceling the dialog. | 377 // The default action is equivalent to canceling the dialog. |
377 WebView.setPermission( | 378 WebView.setPermission( |
378 getInstanceId(), requestId, 'default', '', function(allowed) { | 379 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
379 if (allowed) { | 380 if (allowed) { |
380 return; | 381 return; |
381 } | 382 } |
382 showWarningMessage(event.messageType); | 383 showWarningMessage(event.messageType); |
383 }); | 384 }); |
384 } | 385 } |
385 }; | 386 }; |
386 | 387 |
387 WebViewEvents.prototype.handleLoadAbortEvent = function(event, webViewEvent) { | 388 WebViewEvents.prototype.handleLoadAbortEvent = function(event, webViewEvent) { |
388 var showWarningMessage = function(reason) { | 389 var showWarningMessage = function(reason) { |
(...skipping 23 matching lines...) Expand all Loading... |
412 var ERROR_MSG_WEBVIEW_EXPECTED = '<webview> element expected.'; | 413 var ERROR_MSG_WEBVIEW_EXPECTED = '<webview> element expected.'; |
413 | 414 |
414 var showWarningMessage = function() { | 415 var showWarningMessage = function() { |
415 var WARNING_MSG_NEWWINDOW_BLOCKED = '<webview>: A new window was blocked.'; | 416 var WARNING_MSG_NEWWINDOW_BLOCKED = '<webview>: A new window was blocked.'; |
416 window.console.warn(WARNING_MSG_NEWWINDOW_BLOCKED); | 417 window.console.warn(WARNING_MSG_NEWWINDOW_BLOCKED); |
417 }; | 418 }; |
418 | 419 |
419 var requestId = event.requestId; | 420 var requestId = event.requestId; |
420 var actionTaken = false; | 421 var actionTaken = false; |
421 var self = this; | 422 var self = this; |
422 var getInstanceId = function() { | 423 var getGuestInstanceId = function() { |
423 return self.webViewInternal.getInstanceId(); | 424 return self.webViewInternal.getGuestInstanceId(); |
424 }; | 425 }; |
425 | 426 |
426 var validateCall = function () { | 427 var validateCall = function () { |
427 if (actionTaken) { | 428 if (actionTaken) { |
428 throw new Error(ERROR_MSG_NEWWINDOW_ACTION_ALREADY_TAKEN); | 429 throw new Error(ERROR_MSG_NEWWINDOW_ACTION_ALREADY_TAKEN); |
429 } | 430 } |
430 actionTaken = true; | 431 actionTaken = true; |
431 }; | 432 }; |
432 | 433 |
433 var windowObj = { | 434 var windowObj = { |
(...skipping 16 matching lines...) Expand all Loading... |
450 var attached = webViewInternal.attachWindow(event.windowId, true); | 451 var attached = webViewInternal.attachWindow(event.windowId, true); |
451 | 452 |
452 if (!attached) { | 453 if (!attached) { |
453 window.console.error(ERROR_MSG_NEWWINDOW_UNABLE_TO_ATTACH); | 454 window.console.error(ERROR_MSG_NEWWINDOW_UNABLE_TO_ATTACH); |
454 } | 455 } |
455 // If the object being passed into attach is not a valid <webview> | 456 // If the object being passed into attach is not a valid <webview> |
456 // then we will fail and it will be treated as if the new window | 457 // then we will fail and it will be treated as if the new window |
457 // was rejected. The permission API plumbing is used here to clean | 458 // was rejected. The permission API plumbing is used here to clean |
458 // up the state created for the new window if attaching fails. | 459 // up the state created for the new window if attaching fails. |
459 WebView.setPermission( | 460 WebView.setPermission( |
460 getInstanceId(), requestId, attached ? 'allow' : 'deny'); | 461 getGuestInstanceId(), requestId, attached ? 'allow' : 'deny'); |
461 }, 0); | 462 }, 0); |
462 }, | 463 }, |
463 discard: function() { | 464 discard: function() { |
464 validateCall(); | 465 validateCall(); |
465 WebView.setPermission(getInstanceId(), requestId, 'deny'); | 466 WebView.setPermission(getGuestInstanceId(), requestId, 'deny'); |
466 } | 467 } |
467 }; | 468 }; |
468 webViewEvent.window = windowObj; | 469 webViewEvent.window = windowObj; |
469 | 470 |
470 var defaultPrevented = !self.webViewInternal.dispatchEvent(webViewEvent); | 471 var defaultPrevented = !self.webViewInternal.dispatchEvent(webViewEvent); |
471 if (actionTaken) { | 472 if (actionTaken) { |
472 return; | 473 return; |
473 } | 474 } |
474 | 475 |
475 if (defaultPrevented) { | 476 if (defaultPrevented) { |
476 // Make browser plugin track lifetime of |windowObj|. | 477 // Make browser plugin track lifetime of |windowObj|. |
477 MessagingNatives.BindToGC(windowObj, function() { | 478 MessagingNatives.BindToGC(windowObj, function() { |
478 // Avoid showing a warning message if the decision has already been made. | 479 // Avoid showing a warning message if the decision has already been made. |
479 if (actionTaken) { | 480 if (actionTaken) { |
480 return; | 481 return; |
481 } | 482 } |
482 WebView.setPermission( | 483 WebView.setPermission( |
483 getInstanceId(), requestId, 'default', '', function(allowed) { | 484 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
484 if (allowed) { | 485 if (allowed) { |
485 return; | 486 return; |
486 } | 487 } |
487 showWarningMessage(); | 488 showWarningMessage(); |
488 }); | 489 }); |
489 }); | 490 }); |
490 } else { | 491 } else { |
491 actionTaken = true; | 492 actionTaken = true; |
492 // The default action is to discard the window. | 493 // The default action is to discard the window. |
493 WebView.setPermission( | 494 WebView.setPermission( |
494 getInstanceId(), requestId, 'default', '', function(allowed) { | 495 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
495 if (allowed) { | 496 if (allowed) { |
496 return; | 497 return; |
497 } | 498 } |
498 showWarningMessage(); | 499 showWarningMessage(); |
499 }); | 500 }); |
500 } | 501 } |
501 }; | 502 }; |
502 | 503 |
503 WebViewEvents.prototype.getPermissionTypes = function() { | 504 WebViewEvents.prototype.getPermissionTypes = function() { |
504 var permissions = | 505 var permissions = |
(...skipping 14 matching lines...) Expand all Loading... |
519 | 520 |
520 var showWarningMessage = function(permission) { | 521 var showWarningMessage = function(permission) { |
521 var WARNING_MSG_PERMISSION_DENIED = '<webview>: ' + | 522 var WARNING_MSG_PERMISSION_DENIED = '<webview>: ' + |
522 'The permission request for "%1" has been denied.'; | 523 'The permission request for "%1" has been denied.'; |
523 window.console.warn( | 524 window.console.warn( |
524 WARNING_MSG_PERMISSION_DENIED.replace('%1', permission)); | 525 WARNING_MSG_PERMISSION_DENIED.replace('%1', permission)); |
525 }; | 526 }; |
526 | 527 |
527 var requestId = event.requestId; | 528 var requestId = event.requestId; |
528 var self = this; | 529 var self = this; |
529 var getInstanceId = function() { | 530 var getGuestInstanceId = function() { |
530 return self.webViewInternal.getInstanceId(); | 531 return self.webViewInternal.getGuestInstanceId(); |
531 }; | 532 }; |
532 | 533 |
533 if (this.getPermissionTypes().indexOf(event.permission) < 0) { | 534 if (this.getPermissionTypes().indexOf(event.permission) < 0) { |
534 // The permission type is not allowed. Trigger the default response. | 535 // The permission type is not allowed. Trigger the default response. |
535 WebView.setPermission( | 536 WebView.setPermission( |
536 getInstanceId(), requestId, 'default', '', function(allowed) { | 537 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
537 if (allowed) { | 538 if (allowed) { |
538 return; | 539 return; |
539 } | 540 } |
540 showWarningMessage(event.permission); | 541 showWarningMessage(event.permission); |
541 }); | 542 }); |
542 return; | 543 return; |
543 } | 544 } |
544 | 545 |
545 var decisionMade = false; | 546 var decisionMade = false; |
546 var validateCall = function() { | 547 var validateCall = function() { |
547 if (decisionMade) { | 548 if (decisionMade) { |
548 throw new Error(ERROR_MSG_PERMISSION_ALREADY_DECIDED); | 549 throw new Error(ERROR_MSG_PERMISSION_ALREADY_DECIDED); |
549 } | 550 } |
550 decisionMade = true; | 551 decisionMade = true; |
551 }; | 552 }; |
552 | 553 |
553 // Construct the event.request object. | 554 // Construct the event.request object. |
554 var request = { | 555 var request = { |
555 allow: function() { | 556 allow: function() { |
556 validateCall(); | 557 validateCall(); |
557 WebView.setPermission(getInstanceId(), requestId, 'allow'); | 558 WebView.setPermission(getGuestInstanceId(), requestId, 'allow'); |
558 }, | 559 }, |
559 deny: function() { | 560 deny: function() { |
560 validateCall(); | 561 validateCall(); |
561 WebView.setPermission(getInstanceId(), requestId, 'deny'); | 562 WebView.setPermission(getGuestInstanceId(), requestId, 'deny'); |
562 } | 563 } |
563 }; | 564 }; |
564 webViewEvent.request = request; | 565 webViewEvent.request = request; |
565 | 566 |
566 var defaultPrevented = !self.webViewInternal.dispatchEvent(webViewEvent); | 567 var defaultPrevented = !self.webViewInternal.dispatchEvent(webViewEvent); |
567 if (decisionMade) { | 568 if (decisionMade) { |
568 return; | 569 return; |
569 } | 570 } |
570 | 571 |
571 if (defaultPrevented) { | 572 if (defaultPrevented) { |
572 // Make browser plugin track lifetime of |request|. | 573 // Make browser plugin track lifetime of |request|. |
573 MessagingNatives.BindToGC(request, function() { | 574 MessagingNatives.BindToGC(request, function() { |
574 // Avoid showing a warning message if the decision has already been made. | 575 // Avoid showing a warning message if the decision has already been made. |
575 if (decisionMade) { | 576 if (decisionMade) { |
576 return; | 577 return; |
577 } | 578 } |
578 WebView.setPermission( | 579 WebView.setPermission( |
579 getInstanceId(), requestId, 'default', '', function(allowed) { | 580 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
580 if (allowed) { | 581 if (allowed) { |
581 return; | 582 return; |
582 } | 583 } |
583 showWarningMessage(event.permission); | 584 showWarningMessage(event.permission); |
584 }); | 585 }); |
585 }); | 586 }); |
586 } else { | 587 } else { |
587 decisionMade = true; | 588 decisionMade = true; |
588 WebView.setPermission( | 589 WebView.setPermission( |
589 getInstanceId(), requestId, 'default', '', function(allowed) { | 590 getGuestInstanceId(), requestId, 'default', '', |
590 if (allowed) { | 591 function(allowed) { |
591 return; | 592 if (allowed) { |
592 } | 593 return; |
593 showWarningMessage(event.permission); | 594 } |
594 }); | 595 showWarningMessage(event.permission); |
| 596 }); |
595 } | 597 } |
596 }; | 598 }; |
597 | 599 |
598 WebViewEvents.prototype.handleSizeChangedEvent = function( | 600 WebViewEvents.prototype.handleSizeChangedEvent = function( |
599 event, webViewEvent) { | 601 event, webViewEvent) { |
600 this.webViewInternal.onSizeChanged(webViewEvent); | 602 this.webViewInternal.onSizeChanged(webViewEvent); |
601 }; | 603 }; |
602 | 604 |
603 exports.WebViewEvents = WebViewEvents; | 605 exports.WebViewEvents = WebViewEvents; |
604 exports.CreateEvent = CreateEvent; | 606 exports.CreateEvent = CreateEvent; |
OLD | NEW |