Можем ли мы удалить свойство getContext тега HTML5 Canvas с помощью скрипта? - PullRequest
3 голосов
/ 30 сентября 2011

Существует набор тестов на соответствие HTML5 с тестом на прототип для HTMLCanvasElement.

Этот тест не проходит для Safari, Firefox, но проходит для Opera в Windows 7.

В тесте есть скрипт, который пытается удалить свойство getContext HTMLCanvasElement, и дальнейшая попытка чтения getContext должна дать undefined.

delete window.HTMLCanvasElement.prototype.getContext;
_assertSame(window.HTMLCanvasElement.prototype.getContext, undefined, "window.HTMLCanvasElement.prototype.getContext", "undefined");

Этот тест не выполняется дляWebKit (Safari), поскольку свойство getContext имеет атрибут DontDelete и поэтому не позволяет сценарию удалить это свойство.

Есть ли в спецификации HTML5 какое-либо описание, в котором говорится, что удаление свойства getContext скриптом допустимо?

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Есть ли в спецификации HTML5 какое-либо описание, в котором говорится, что удаление свойства getContext скриптом допустимо?

Нет, в спецификации нет ничего явного.Понятия не имею, почему webkit здесь отличается от FF / Opera (также Chrome запрещает удаление), но сама спецификация не требует DontDelete для чего-либо на Canvas.Что-то еще в спецификации ECMAScript может.

Firefox 7 и 8 alpha не удаляют window.HTMLCanvasElement.prototype.getContext, хотя.Они просто возвращают true, но getContext все еще там.Другими словами, тест, с которым вы связались, не проходит точно в том же месте и по той же причине.

Конечно, Webkit все еще позволяет перезаписывать все, что вы хотите: window.HTMLCanvasElement.prototype.getContext = undefined

2 голосов
/ 03 октября 2011

Насколько я понимаю, конфигурируемость ([[DontDelete]] в ES3, [[Configurable]] в ES5) метода getContext описана в WebIDL - как и любые другие CanvasRenderingContext2D методы.

Взгляните на «Интерфейсный прототип объекта» раздел, в котором написано:

Должен существовать объект-прототип интерфейса для каждого определенного интерфейса, независимо от того, был ли интерфейс объявлен с расширенным атрибутом [NoInterfaceObject]. Прототип объекта интерфейса для определенного интерфейса имеет свойства, которые соответствуют атрибутам и операциям, определенным в этом интерфейсе. Эти свойства более подробно описаны ниже в разделах 4.5.5 и 4.5.6.

А в 4.5.6 вы можете увидеть:

Для каждого уникального идентификатора операции, определенной в интерфейсе, должно быть соответствующее свойство объекта-прототипа интерфейса (если это обычная операция) или объекта интерфейса (если это статическая операция), если только У перегрузки, установленной для этого идентификатора и операции и с количеством аргументов 0 (для привязки языка ECMAScript), нет записей.

Характеристики такого соответствующего свойства следующие:

Имя свойства является идентификатором.

Свойство имеет атрибуты {[[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }.

Обратите внимание на бит «[[Configurable]]: true» (выделено мной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...