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