| 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 |