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 WebView. |
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'); |
11 var MessagingNatives = requireNative('messaging_natives'); | 11 var MessagingNatives = requireNative('messaging_natives'); |
12 var WebRequestEvent = require('webRequestInternal').WebRequestEvent; | 12 var WebRequestEvent = require('webRequestInternal').WebRequestEvent; |
13 var WebRequestSchema = | 13 var WebRequestSchema = |
14 requireNative('schema_registry').GetSchema('webRequest'); | 14 requireNative('schema_registry').GetSchema('webRequest'); |
15 var WebView = require('webViewInternal').WebView; | 15 var WebViewInternal = require('webViewInternal').WebViewInternal; |
16 | 16 |
17 var CreateEvent = function(name) { | 17 var CreateEvent = function(name) { |
18 var eventOpts = {supportsListeners: true, supportsFilters: true}; | 18 var eventOpts = {supportsListeners: true, supportsFilters: true}; |
19 return new EventBindings.Event(name, undefined, eventOpts); | 19 return new EventBindings.Event(name, undefined, eventOpts); |
20 }; | 20 }; |
21 | 21 |
22 var FrameNameChangedEvent = CreateEvent('webViewInternal.onFrameNameChanged'); | 22 var FrameNameChangedEvent = CreateEvent('webViewInternal.onFrameNameChanged'); |
23 var PluginDestroyedEvent = CreateEvent('webViewInternal.onPluginDestroyed'); | 23 var PluginDestroyedEvent = CreateEvent('webViewInternal.onPluginDestroyed'); |
24 var WebRequestMessageEvent = CreateEvent('webViewInternal.onMessage'); | 24 var WebRequestMessageEvent = CreateEvent('webViewInternal.onMessage'); |
25 | 25 |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 }; | 327 }; |
328 | 328 |
329 var getGuestInstanceId = function() { | 329 var getGuestInstanceId = function() { |
330 return this.webViewInternal.getGuestInstanceId(); | 330 return this.webViewInternal.getGuestInstanceId(); |
331 }.bind(this); | 331 }.bind(this); |
332 | 332 |
333 var dialog = { | 333 var dialog = { |
334 ok: function(user_input) { | 334 ok: function(user_input) { |
335 validateCall(); | 335 validateCall(); |
336 user_input = user_input || ''; | 336 user_input = user_input || ''; |
337 WebView.setPermission(getGuestInstanceId(), requestId, 'allow', | 337 WebViewInternal.setPermission(getGuestInstanceId(), requestId, 'allow', |
338 user_input); | 338 user_input); |
339 }, | 339 }, |
340 cancel: function() { | 340 cancel: function() { |
341 validateCall(); | 341 validateCall(); |
342 WebView.setPermission(getGuestInstanceId(), requestId, 'deny'); | 342 WebViewInternal.setPermission(getGuestInstanceId(), requestId, 'deny'); |
343 } | 343 } |
344 }; | 344 }; |
345 webViewEvent.dialog = dialog; | 345 webViewEvent.dialog = dialog; |
346 | 346 |
347 var defaultPrevented = !this.webViewInternal.dispatchEvent(webViewEvent); | 347 var defaultPrevented = !this.webViewInternal.dispatchEvent(webViewEvent); |
348 if (actionTaken) { | 348 if (actionTaken) { |
349 return; | 349 return; |
350 } | 350 } |
351 | 351 |
352 if (defaultPrevented) { | 352 if (defaultPrevented) { |
353 // Tell the JavaScript garbage collector to track lifetime of |dialog| and | 353 // Tell the JavaScript garbage collector to track lifetime of |dialog| and |
354 // call back when the dialog object has been collected. | 354 // call back when the dialog object has been collected. |
355 MessagingNatives.BindToGC(dialog, function() { | 355 MessagingNatives.BindToGC(dialog, function() { |
356 // Avoid showing a warning message if the decision has already been made. | 356 // Avoid showing a warning message if the decision has already been made. |
357 if (actionTaken) { | 357 if (actionTaken) { |
358 return; | 358 return; |
359 } | 359 } |
360 WebView.setPermission( | 360 WebViewInternal.setPermission( |
361 getGuestInstanceId(), requestId, 'default', '', function(allowed) { | 361 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
362 if (allowed) { | 362 if (allowed) { |
363 return; | 363 return; |
364 } | 364 } |
365 showWarningMessage(event.messageType); | 365 showWarningMessage(event.messageType); |
366 }); | 366 }); |
367 }); | 367 }); |
368 } else { | 368 } else { |
369 actionTaken = true; | 369 actionTaken = true; |
370 // The default action is equivalent to canceling the dialog. | 370 // The default action is equivalent to canceling the dialog. |
371 WebView.setPermission( | 371 WebViewInternal.setPermission( |
372 getGuestInstanceId(), requestId, 'default', '', function(allowed) { | 372 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
373 if (allowed) { | 373 if (allowed) { |
374 return; | 374 return; |
375 } | 375 } |
376 showWarningMessage(event.messageType); | 376 showWarningMessage(event.messageType); |
377 }); | 377 }); |
378 } | 378 } |
379 }; | 379 }; |
380 | 380 |
381 WebViewEvents.prototype.handleLoadAbortEvent = function(event, webViewEvent) { | 381 WebViewEvents.prototype.handleLoadAbortEvent = function(event, webViewEvent) { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 if (!guestInstanceId) { | 451 if (!guestInstanceId) { |
452 // If the opener is already gone, then we won't have its | 452 // If the opener is already gone, then we won't have its |
453 // guestInstanceId. | 453 // guestInstanceId. |
454 return; | 454 return; |
455 } | 455 } |
456 | 456 |
457 // If the object being passed into attach is not a valid <webview> | 457 // If the object being passed into attach is not a valid <webview> |
458 // then we will fail and it will be treated as if the new window | 458 // then we will fail and it will be treated as if the new window |
459 // was rejected. The permission API plumbing is used here to clean | 459 // was rejected. The permission API plumbing is used here to clean |
460 // up the state created for the new window if attaching fails. | 460 // up the state created for the new window if attaching fails. |
461 WebView.setPermission( | 461 WebViewInternal.setPermission( |
462 guestInstanceId, requestId, attached ? 'allow' : 'deny'); | 462 guestInstanceId, requestId, attached ? 'allow' : 'deny'); |
463 }, 0); | 463 }, 0); |
464 }, | 464 }, |
465 discard: function() { | 465 discard: function() { |
466 validateCall(); | 466 validateCall(); |
467 var guestInstanceId = getGuestInstanceId(); | 467 var guestInstanceId = getGuestInstanceId(); |
468 if (!guestInstanceId) { | 468 if (!guestInstanceId) { |
469 // If the opener is already gone, then we won't have its | 469 // If the opener is already gone, then we won't have its |
470 // guestInstanceId. | 470 // guestInstanceId. |
471 return; | 471 return; |
472 } | 472 } |
473 WebView.setPermission(guestInstanceId, requestId, 'deny'); | 473 WebViewInternal.setPermission(guestInstanceId, requestId, 'deny'); |
474 } | 474 } |
475 }; | 475 }; |
476 webViewEvent.window = windowObj; | 476 webViewEvent.window = windowObj; |
477 | 477 |
478 var defaultPrevented = !this.webViewInternal.dispatchEvent(webViewEvent); | 478 var defaultPrevented = !this.webViewInternal.dispatchEvent(webViewEvent); |
479 if (actionTaken) { | 479 if (actionTaken) { |
480 return; | 480 return; |
481 } | 481 } |
482 | 482 |
483 if (defaultPrevented) { | 483 if (defaultPrevented) { |
484 // Make browser plugin track lifetime of |windowObj|. | 484 // Make browser plugin track lifetime of |windowObj|. |
485 MessagingNatives.BindToGC(windowObj, function() { | 485 MessagingNatives.BindToGC(windowObj, function() { |
486 // Avoid showing a warning message if the decision has already been made. | 486 // Avoid showing a warning message if the decision has already been made. |
487 if (actionTaken) { | 487 if (actionTaken) { |
488 return; | 488 return; |
489 } | 489 } |
490 | 490 |
491 var guestInstanceId = getGuestInstanceId(); | 491 var guestInstanceId = getGuestInstanceId(); |
492 if (!guestInstanceId) { | 492 if (!guestInstanceId) { |
493 // If the opener is already gone, then we won't have its | 493 // If the opener is already gone, then we won't have its |
494 // guestInstanceId. | 494 // guestInstanceId. |
495 return; | 495 return; |
496 } | 496 } |
497 | 497 |
498 WebView.setPermission( | 498 WebViewInternal.setPermission( |
499 guestInstanceId, requestId, 'default', '', function(allowed) { | 499 guestInstanceId, requestId, 'default', '', function(allowed) { |
500 if (allowed) { | 500 if (allowed) { |
501 return; | 501 return; |
502 } | 502 } |
503 showWarningMessage(); | 503 showWarningMessage(); |
504 }); | 504 }); |
505 }); | 505 }); |
506 } else { | 506 } else { |
507 actionTaken = true; | 507 actionTaken = true; |
508 // The default action is to discard the window. | 508 // The default action is to discard the window. |
509 WebView.setPermission( | 509 WebViewInternal.setPermission( |
510 getGuestInstanceId(), requestId, 'default', '', function(allowed) { | 510 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
511 if (allowed) { | 511 if (allowed) { |
512 return; | 512 return; |
513 } | 513 } |
514 showWarningMessage(); | 514 showWarningMessage(); |
515 }); | 515 }); |
516 } | 516 } |
517 }; | 517 }; |
518 | 518 |
519 WebViewEvents.prototype.handlePermissionEvent = | 519 WebViewEvents.prototype.handlePermissionEvent = |
520 function(event, webViewEvent) { | 520 function(event, webViewEvent) { |
521 var ERROR_MSG_PERMISSION_ALREADY_DECIDED = '<webview>: ' + | 521 var ERROR_MSG_PERMISSION_ALREADY_DECIDED = '<webview>: ' + |
522 'Permission has already been decided for this "permissionrequest" event.'; | 522 'Permission has already been decided for this "permissionrequest" event.'; |
523 | 523 |
524 var showWarningMessage = function(permission) { | 524 var showWarningMessage = function(permission) { |
525 var WARNING_MSG_PERMISSION_DENIED = '<webview>: ' + | 525 var WARNING_MSG_PERMISSION_DENIED = '<webview>: ' + |
526 'The permission request for "%1" has been denied.'; | 526 'The permission request for "%1" has been denied.'; |
527 window.console.warn( | 527 window.console.warn( |
528 WARNING_MSG_PERMISSION_DENIED.replace('%1', permission)); | 528 WARNING_MSG_PERMISSION_DENIED.replace('%1', permission)); |
529 }; | 529 }; |
530 | 530 |
531 var requestId = event.requestId; | 531 var requestId = event.requestId; |
532 var getGuestInstanceId = function() { | 532 var getGuestInstanceId = function() { |
533 return this.webViewInternal.getGuestInstanceId(); | 533 return this.webViewInternal.getGuestInstanceId(); |
534 }.bind(this); | 534 }.bind(this); |
535 | 535 |
536 if (this.permissionTypes.indexOf(event.permission) < 0) { | 536 if (this.permissionTypes.indexOf(event.permission) < 0) { |
537 // The permission type is not allowed. Trigger the default response. | 537 // The permission type is not allowed. Trigger the default response. |
538 WebView.setPermission( | 538 WebViewInternal.setPermission( |
539 getGuestInstanceId(), requestId, 'default', '', function(allowed) { | 539 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
540 if (!allowed) | 540 if (!allowed) |
541 showWarningMessage(event.permission); | 541 showWarningMessage(event.permission); |
542 }); | 542 }); |
543 return; | 543 return; |
544 } | 544 } |
545 | 545 |
546 var decisionMade = false; | 546 var decisionMade = false; |
547 var validateCall = function() { | 547 var validateCall = function() { |
548 if (decisionMade) { | 548 if (decisionMade) { |
549 throw new Error(ERROR_MSG_PERMISSION_ALREADY_DECIDED); | 549 throw new Error(ERROR_MSG_PERMISSION_ALREADY_DECIDED); |
550 } | 550 } |
551 decisionMade = true; | 551 decisionMade = true; |
552 }; | 552 }; |
553 | 553 |
554 // Construct the event.request object. | 554 // Construct the event.request object. |
555 var request = { | 555 var request = { |
556 allow: function() { | 556 allow: function() { |
557 validateCall(); | 557 validateCall(); |
558 WebView.setPermission(getGuestInstanceId(), requestId, 'allow'); | 558 WebViewInternal.setPermission(getGuestInstanceId(), requestId, 'allow'); |
559 }, | 559 }, |
560 deny: function() { | 560 deny: function() { |
561 validateCall(); | 561 validateCall(); |
562 WebView.setPermission(getGuestInstanceId(), requestId, 'deny'); | 562 WebViewInternal.setPermission(getGuestInstanceId(), requestId, 'deny'); |
563 } | 563 } |
564 }; | 564 }; |
565 webViewEvent.request = request; | 565 webViewEvent.request = request; |
566 | 566 |
567 var defaultPrevented = !this.webViewInternal.dispatchEvent(webViewEvent); | 567 var defaultPrevented = !this.webViewInternal.dispatchEvent(webViewEvent); |
568 if (decisionMade) { | 568 if (decisionMade) { |
569 return; | 569 return; |
570 } | 570 } |
571 | 571 |
572 if (defaultPrevented) { | 572 if (defaultPrevented) { |
573 // Make browser plugin track lifetime of |request|. | 573 // Make browser plugin track lifetime of |request|. |
574 MessagingNatives.BindToGC(request, function() { | 574 MessagingNatives.BindToGC(request, function() { |
575 // 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. |
576 if (decisionMade) { | 576 if (decisionMade) { |
577 return; | 577 return; |
578 } | 578 } |
579 WebView.setPermission( | 579 WebViewInternal.setPermission( |
580 getGuestInstanceId(), requestId, 'default', '', function(allowed) { | 580 getGuestInstanceId(), requestId, 'default', '', function(allowed) { |
581 if (allowed) { | 581 if (allowed) { |
582 return; | 582 return; |
583 } | 583 } |
584 showWarningMessage(event.permission); | 584 showWarningMessage(event.permission); |
585 }); | 585 }); |
586 }); | 586 }); |
587 } else { | 587 } else { |
588 decisionMade = true; | 588 decisionMade = true; |
589 WebView.setPermission( | 589 WebViewInternal.setPermission( |
590 getGuestInstanceId(), requestId, 'default', '', | 590 getGuestInstanceId(), requestId, 'default', '', |
591 function(allowed) { | 591 function(allowed) { |
592 if (allowed) { | 592 if (allowed) { |
593 return; | 593 return; |
594 } | 594 } |
595 showWarningMessage(event.permission); | 595 showWarningMessage(event.permission); |
596 }); | 596 }); |
597 } | 597 } |
598 }; | 598 }; |
599 | 599 |
600 WebViewEvents.prototype.handleSizeChangedEvent = function( | 600 WebViewEvents.prototype.handleSizeChangedEvent = function( |
601 event, webViewEvent) { | 601 event, webViewEvent) { |
602 this.webViewInternal.onSizeChanged(webViewEvent); | 602 this.webViewInternal.onSizeChanged(webViewEvent); |
603 }; | 603 }; |
604 | 604 |
605 exports.WebViewEvents = WebViewEvents; | 605 exports.WebViewEvents = WebViewEvents; |
606 exports.CreateEvent = CreateEvent; | 606 exports.CreateEvent = CreateEvent; |
OLD | NEW |