Index: third_party/WebKit/Source/core/html/MediaDocument.cpp |
diff --git a/third_party/WebKit/Source/core/html/MediaDocument.cpp b/third_party/WebKit/Source/core/html/MediaDocument.cpp |
deleted file mode 100644 |
index 646e6fe49749fcddb4602990b71a680202d23ab1..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/core/html/MediaDocument.cpp |
+++ /dev/null |
@@ -1,299 +0,0 @@ |
-/* |
- * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * |
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "core/html/MediaDocument.h" |
- |
-#include "bindings/core/v8/AddEventListenerOptionsOrBoolean.h" |
-#include "bindings/core/v8/ExceptionState.h" |
-#include "core/HTMLNames.h" |
-#include "core/dom/DocumentUserGestureToken.h" |
-#include "core/dom/ElementTraversal.h" |
-#include "core/dom/RawDataDocumentParser.h" |
-#include "core/dom/shadow/ShadowRoot.h" |
-#include "core/events/Event.h" |
-#include "core/events/EventListener.h" |
-#include "core/events/KeyboardEvent.h" |
-#include "core/frame/LocalFrame.h" |
-#include "core/frame/LocalFrameClient.h" |
-#include "core/frame/Settings.h" |
-#include "core/frame/UseCounter.h" |
-#include "core/html/HTMLAnchorElement.h" |
-#include "core/html/HTMLBodyElement.h" |
-#include "core/html/HTMLContentElement.h" |
-#include "core/html/HTMLDivElement.h" |
-#include "core/html/HTMLHeadElement.h" |
-#include "core/html/HTMLHtmlElement.h" |
-#include "core/html/HTMLMetaElement.h" |
-#include "core/html/HTMLSourceElement.h" |
-#include "core/html/HTMLStyleElement.h" |
-#include "core/html/HTMLVideoElement.h" |
-#include "core/loader/DocumentLoader.h" |
-#include "core/loader/FrameLoader.h" |
-#include "platform/Histogram.h" |
-#include "platform/KeyboardCodes.h" |
-#include "platform/UserGestureIndicator.h" |
-#include "platform/text/PlatformLocale.h" |
- |
-namespace blink { |
- |
-using namespace HTMLNames; |
- |
-// Enums used for UMA histogram. |
-enum MediaDocumentDownloadButtonValue { |
- MediaDocumentDownloadButtonShown, |
- MediaDocumentDownloadButtonClicked, |
- // Only append new enums here. |
- MediaDocumentDownloadButtonMax |
-}; |
- |
-void recordDownloadMetric(MediaDocumentDownloadButtonValue value) { |
- DEFINE_STATIC_LOCAL( |
- EnumerationHistogram, mediaDocumentDownloadButtonHistogram, |
- ("Blink.MediaDocument.DownloadButton", MediaDocumentDownloadButtonMax)); |
- mediaDocumentDownloadButtonHistogram.count(value); |
-} |
- |
-// FIXME: Share more code with PluginDocumentParser. |
-class MediaDocumentParser : public RawDataDocumentParser { |
- public: |
- static MediaDocumentParser* create(MediaDocument* document) { |
- return new MediaDocumentParser(document); |
- } |
- |
- private: |
- explicit MediaDocumentParser(Document* document) |
- : RawDataDocumentParser(document), m_didBuildDocumentStructure(false) {} |
- |
- void appendBytes(const char*, size_t) override; |
- |
- void createDocumentStructure(); |
- |
- bool m_didBuildDocumentStructure; |
-}; |
- |
-class MediaDownloadEventListener final : public EventListener { |
- public: |
- static MediaDownloadEventListener* create() { |
- return new MediaDownloadEventListener(); |
- } |
- |
- bool operator==(const EventListener& other) const override { |
- return this == &other; |
- } |
- |
- private: |
- MediaDownloadEventListener() |
- : EventListener(CPPEventListenerType), m_clicked(false) {} |
- |
- void handleEvent(ExecutionContext* context, Event* event) override { |
- if (!m_clicked) { |
- recordDownloadMetric(MediaDocumentDownloadButtonClicked); |
- m_clicked = true; |
- } |
- } |
- |
- bool m_clicked; |
-}; |
- |
-class MediaLoadedEventListener final : public EventListener { |
- WTF_MAKE_NONCOPYABLE(MediaLoadedEventListener); |
- |
- public: |
- static MediaLoadedEventListener* create() { |
- return new MediaLoadedEventListener(); |
- } |
- |
- bool operator==(const EventListener& other) const override { |
- return this == &other; |
- } |
- |
- private: |
- MediaLoadedEventListener() : EventListener(CPPEventListenerType) {} |
- |
- void handleEvent(ExecutionContext* context, Event* event) override { |
- HTMLVideoElement* media = |
- static_cast<HTMLVideoElement*>(event->target()->toNode()); |
- UserGestureIndicator gesture( |
- DocumentUserGestureToken::create(&media->document())); |
- // TODO(shaktisahu): Enable fullscreen after https://crbug/698353 is fixed. |
- media->play(); |
- } |
-}; |
- |
-void MediaDocumentParser::createDocumentStructure() { |
- DCHECK(document()); |
- HTMLHtmlElement* rootElement = HTMLHtmlElement::create(*document()); |
- document()->appendChild(rootElement); |
- rootElement->insertedByParser(); |
- |
- if (isDetached()) |
- return; // runScriptsAtDocumentElementAvailable can detach the frame. |
- |
- HTMLHeadElement* head = HTMLHeadElement::create(*document()); |
- HTMLMetaElement* meta = HTMLMetaElement::create(*document()); |
- meta->setAttribute(nameAttr, "viewport"); |
- meta->setAttribute(contentAttr, "width=device-width"); |
- head->appendChild(meta); |
- |
- HTMLVideoElement* media = HTMLVideoElement::create(*document()); |
- media->setAttribute(controlsAttr, ""); |
- media->setAttribute(autoplayAttr, ""); |
- media->setAttribute(nameAttr, "media"); |
- |
- HTMLSourceElement* source = HTMLSourceElement::create(*document()); |
- source->setSrc(document()->url()); |
- |
- if (DocumentLoader* loader = document()->loader()) |
- source->setType(loader->responseMIMEType()); |
- |
- media->appendChild(source); |
- |
- HTMLBodyElement* body = HTMLBodyElement::create(*document()); |
- body->setAttribute(styleAttr, "margin: 0px;"); |
- |
- document()->willInsertBody(); |
- |
- HTMLDivElement* div = HTMLDivElement::create(*document()); |
- // Style sheets for media controls are lazily loaded until a media element is |
- // encountered. As a result, elements encountered before the media element |
- // will not get the right style at first if we put the styles in |
- // mediacontrols.css. To solve this issue, set the styles inline so that they |
- // will be applied when the page loads. See w3c example on how to centering |
- // an element: https://www.w3.org/Style/Examples/007/center.en.html |
- div->setAttribute(styleAttr, |
- "display: flex;" |
- "flex-direction: column;" |
- "justify-content: center;" |
- "align-items: center;" |
- "min-height: min-content;" |
- "height: 100%;"); |
- HTMLContentElement* content = HTMLContentElement::create(*document()); |
- div->appendChild(content); |
- |
- if (document()->settings() && |
- document()->settings()->getEmbeddedMediaExperienceEnabled() && |
- source->type().startsWith("video/", TextCaseASCIIInsensitive)) { |
- EventListener* listener = MediaLoadedEventListener::create(); |
- AddEventListenerOptions options; |
- options.setOnce(true); |
- AddEventListenerOptionsOrBoolean optionsOrBoolean; |
- optionsOrBoolean.setAddEventListenerOptions(options); |
- media->addEventListener(EventTypeNames::loadedmetadata, listener, |
- optionsOrBoolean); |
- } |
- |
- if (RuntimeEnabledFeatures::mediaDocumentDownloadButtonEnabled()) { |
- HTMLAnchorElement* anchor = HTMLAnchorElement::create(*document()); |
- anchor->setAttribute(downloadAttr, ""); |
- anchor->setURL(document()->url()); |
- anchor->setTextContent( |
- document() |
- ->getCachedLocale(document()->contentLanguage()) |
- .queryString(WebLocalizedString::DownloadButtonLabel) |
- .upper()); |
- // Using CSS style according to Android material design. |
- anchor->setAttribute( |
- styleAttr, |
- "display: inline-block;" |
- "margin-top: 32px;" |
- "padding: 0 16px 0 16px;" |
- "height: 36px;" |
- "background: #000000;" |
- "-webkit-tap-highlight-color: rgba(255, 255, 255, 0.12);" |
- "font-family: Roboto;" |
- "font-size: 14px;" |
- "border-radius: 5px;" |
- "color: white;" |
- "font-weight: 500;" |
- "text-decoration: none;" |
- "line-height: 36px;"); |
- EventListener* listener = MediaDownloadEventListener::create(); |
- anchor->addEventListener(EventTypeNames::click, listener, false); |
- HTMLDivElement* buttonContainer = HTMLDivElement::create(*document()); |
- buttonContainer->setAttribute(styleAttr, |
- "text-align: center;" |
- "height: 0;" |
- "flex: none"); |
- buttonContainer->appendChild(anchor); |
- div->appendChild(buttonContainer); |
- recordDownloadMetric(MediaDocumentDownloadButtonShown); |
- } |
- |
- // According to |
- // https://html.spec.whatwg.org/multipage/browsers.html#read-media, |
- // MediaDocument should have a single child which is the video element. Use |
- // shadow root to hide all the elements we added here. |
- ShadowRoot& shadowRoot = body->ensureUserAgentShadowRoot(); |
- shadowRoot.appendChild(div); |
- body->appendChild(media); |
- rootElement->appendChild(head); |
- rootElement->appendChild(body); |
- |
- m_didBuildDocumentStructure = true; |
-} |
- |
-void MediaDocumentParser::appendBytes(const char*, size_t) { |
- if (m_didBuildDocumentStructure) |
- return; |
- |
- createDocumentStructure(); |
- finish(); |
-} |
- |
-MediaDocument::MediaDocument(const DocumentInit& initializer) |
- : HTMLDocument(initializer, MediaDocumentClass) { |
- setCompatibilityMode(QuirksMode); |
- lockCompatibilityMode(); |
- UseCounter::count(*this, UseCounter::MediaDocument); |
- if (!isInMainFrame()) |
- UseCounter::count(*this, UseCounter::MediaDocumentInFrame); |
-} |
- |
-DocumentParser* MediaDocument::createParser() { |
- return MediaDocumentParser::create(this); |
-} |
- |
-void MediaDocument::defaultEventHandler(Event* event) { |
- Node* targetNode = event->target()->toNode(); |
- if (!targetNode) |
- return; |
- |
- if (event->type() == EventTypeNames::keydown && event->isKeyboardEvent()) { |
- HTMLVideoElement* video = |
- Traversal<HTMLVideoElement>::firstWithin(*targetNode); |
- if (!video) |
- return; |
- |
- KeyboardEvent* keyboardEvent = toKeyboardEvent(event); |
- if (keyboardEvent->key() == " " || |
- keyboardEvent->keyCode() == VKEY_MEDIA_PLAY_PAUSE) { |
- // space or media key (play/pause) |
- video->togglePlayState(); |
- event->setDefaultHandled(); |
- } |
- } |
-} |
- |
-} // namespace blink |