Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(515)

Side by Side Diff: third_party/WebKit/Source/core/html/MediaDocument.cpp

Issue 1780043002: Add download button to MediaDocument on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 11 matching lines...) Expand all
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */ 24 */
25 25
26 #include "core/html/MediaDocument.h" 26 #include "core/html/MediaDocument.h"
27 27
28 #include "bindings/core/v8/ExceptionStatePlaceholder.h" 28 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
29 #include "core/HTMLNames.h" 29 #include "core/HTMLNames.h"
30 #include "core/dom/ElementTraversal.h" 30 #include "core/dom/ElementTraversal.h"
31 #include "core/dom/RawDataDocumentParser.h" 31 #include "core/dom/RawDataDocumentParser.h"
32 #include "core/events/EventListener.h"
32 #include "core/events/KeyboardEvent.h" 33 #include "core/events/KeyboardEvent.h"
33 #include "core/frame/LocalFrame.h" 34 #include "core/frame/LocalFrame.h"
35 #include "core/html/HTMLAnchorElement.h"
34 #include "core/html/HTMLBodyElement.h" 36 #include "core/html/HTMLBodyElement.h"
35 #include "core/html/HTMLHeadElement.h" 37 #include "core/html/HTMLHeadElement.h"
36 #include "core/html/HTMLHtmlElement.h" 38 #include "core/html/HTMLHtmlElement.h"
37 #include "core/html/HTMLMetaElement.h" 39 #include "core/html/HTMLMetaElement.h"
38 #include "core/html/HTMLSourceElement.h" 40 #include "core/html/HTMLSourceElement.h"
39 #include "core/html/HTMLVideoElement.h" 41 #include "core/html/HTMLVideoElement.h"
40 #include "core/loader/DocumentLoader.h" 42 #include "core/loader/DocumentLoader.h"
41 #include "core/loader/FrameLoader.h" 43 #include "core/loader/FrameLoader.h"
42 #include "core/loader/FrameLoaderClient.h" 44 #include "core/loader/FrameLoaderClient.h"
43 #include "platform/KeyboardCodes.h" 45 #include "platform/KeyboardCodes.h"
46 #include "platform/text/PlatformLocale.h"
44 47
45 namespace blink { 48 namespace blink {
46 49
47 using namespace HTMLNames; 50 using namespace HTMLNames;
48 51
49 // FIXME: Share more code with PluginDocumentParser. 52 // FIXME: Share more code with PluginDocumentParser.
50 class MediaDocumentParser : public RawDataDocumentParser { 53 class MediaDocumentParser : public RawDataDocumentParser {
51 public: 54 public:
52 static PassRefPtrWillBeRawPtr<MediaDocumentParser> create(MediaDocument* doc ument) 55 static PassRefPtrWillBeRawPtr<MediaDocumentParser> create(MediaDocument* doc ument)
53 { 56 {
54 return adoptRefWillBeNoop(new MediaDocumentParser(document)); 57 return adoptRefWillBeNoop(new MediaDocumentParser(document));
55 } 58 }
56 59
57 private: 60 private:
58 explicit MediaDocumentParser(Document* document) 61 explicit MediaDocumentParser(Document* document)
59 : RawDataDocumentParser(document) 62 : RawDataDocumentParser(document)
60 , m_didBuildDocumentStructure(false) 63 , m_didBuildDocumentStructure(false)
61 { 64 {
62 } 65 }
63 66
64 void appendBytes(const char*, size_t) override; 67 void appendBytes(const char*, size_t) override;
65 68
66 void createDocumentStructure(); 69 void createDocumentStructure();
67 70
68 bool m_didBuildDocumentStructure; 71 bool m_didBuildDocumentStructure;
69 }; 72 };
70 73
74 class MediaEventListener : public EventListener {
esprehn 2016/03/11 00:35:32 final
qinmin 2016/03/11 23:50:55 Done. This class is no longer needed
75 public:
76 static PassRefPtrWillBeRawPtr<MediaEventListener> create(MediaDocument* docu ment)
77 {
78 return adoptRefWillBeNoop(new MediaEventListener(document));
79 }
80
81 static const MediaEventListener* cast(const EventListener* listener)
esprehn 2016/03/11 00:35:32 this cast method doesn't seem used outside ==, jus
qinmin 2016/03/11 23:50:55 Done. Class removed
82 {
83 return listener->type() == MediaEventListenerType
84 ? static_cast<const MediaEventListener*>(listener) : 0;
85 }
86
87 bool operator==(const EventListener& other) const override;
88
89 DEFINE_INLINE_VIRTUAL_TRACE()
90 {
91 visitor->trace(m_doc);
92 EventListener::trace(visitor);
93 }
94
95 private:
96 MediaEventListener(MediaDocument* document)
esprehn 2016/03/11 00:35:33 explicit
qinmin 2016/03/11 23:50:55 Class removed.
97 : EventListener(MediaEventListenerType)
98 , m_doc(document)
esprehn 2016/03/11 00:35:33 m_document, don't abbreviate
qinmin 2016/03/11 23:50:55 Class removed
99 {
100 }
101
102 virtual void handleEvent(ExecutionContext*, Event* event)
103 {
104 m_doc->updateLayout();
esprehn 2016/03/11 00:35:33 you don't need the m_document thing, just do toDoc
qinmin 2016/03/11 23:50:55 Class removed
105 }
106
107 RawPtrWillBeMember<MediaDocument> m_doc;
108 };
109
71 void MediaDocumentParser::createDocumentStructure() 110 void MediaDocumentParser::createDocumentStructure()
72 { 111 {
73 ASSERT(document()); 112 ASSERT(document());
74 RefPtrWillBeRawPtr<HTMLHtmlElement> rootElement = HTMLHtmlElement::create(*d ocument()); 113 RefPtrWillBeRawPtr<HTMLHtmlElement> rootElement = HTMLHtmlElement::create(*d ocument());
75 rootElement->insertedByParser(); 114 rootElement->insertedByParser();
76 document()->appendChild(rootElement); 115 document()->appendChild(rootElement);
77 116
78 if (document()->frame()) 117 if (document()->frame())
79 document()->frame()->loader().dispatchDocumentElementAvailable(); 118 document()->frame()->loader().dispatchDocumentElementAvailable();
80 119
(...skipping 10 matching lines...) Expand all
91 130
92 RefPtrWillBeRawPtr<HTMLSourceElement> source = HTMLSourceElement::create(*do cument()); 131 RefPtrWillBeRawPtr<HTMLSourceElement> source = HTMLSourceElement::create(*do cument());
93 source->setSrc(document()->url()); 132 source->setSrc(document()->url());
94 133
95 if (DocumentLoader* loader = document()->loader()) 134 if (DocumentLoader* loader = document()->loader())
96 source->setType(loader->responseMIMEType()); 135 source->setType(loader->responseMIMEType());
97 136
98 media->appendChild(source.release()); 137 media->appendChild(source.release());
99 138
100 RefPtrWillBeRawPtr<HTMLBodyElement> body = HTMLBodyElement::create(*document ()); 139 RefPtrWillBeRawPtr<HTMLBodyElement> body = HTMLBodyElement::create(*document ());
140
141 if (RuntimeEnabledFeatures::mediaDocumentDownloadButtonEnabled()) {
142 RefPtrWillBeRawPtr<EventListener> listener = MediaEventListener::create( static_cast<MediaDocument*>(document()));
esprehn 2016/03/11 00:35:33 toMediaDocument, don't static cast. If toMediaDocu
qinmin 2016/03/11 23:50:55 Line removed
143 media->addEventListener("resize", listener, false);
esprehn 2016/03/11 00:35:33 forcing a layout for ever resize event doesn't mak
qinmin 2016/03/11 23:50:55 removed
144
145 RefPtrWillBeRawPtr<HTMLAnchorElement> anchor = HTMLAnchorElement::create (*document());
146 anchor->setAttribute(downloadAttr, "");
147 anchor->setURL(document()->url());
148 anchor->setInnerText(document()->getCachedLocale(document()->contentLang uage()).queryString(WebLocalizedString::DownloadButtonLabel), ASSERT_NO_EXCEPTIO N);
esprehn 2016/03/11 00:35:32 setTextContent, don't use setInnerText
qinmin 2016/03/11 23:50:55 Done.
149 // TODO(qinmin): Move these css to MediaControlsAndroidNew.css when http ://crbug.com/592080 is fixed.
150 anchor->setAttribute(
151 styleAttr,
152 "position: absolute;"
153 "display: block;"
154 "width: 120px;"
155 "height: 36px;"
156 "background: #4285F4;"
157 "font-family: Roboto;"
158 "font-size: 14px;"
159 "border-radius: 5px;"
160 "color: white;"
161 "font-weight: bold;"
162 "text-decoration:none;"
esprehn 2016/03/11 00:35:33 missing space, also this is so much stuff. Is ther
qinmin 2016/03/11 23:50:55 Done. As I mentioned in the TODO above, these css
163 "text-transform: uppercase;"
164 "text-align: center;"
165 "line-height: 36px;"
166 "margin: auto;"
167 "top: 108px;"
168 "bottom: 0;"
169 "left: 0;"
170 "right: 0;");
171 body->appendChild(anchor.release());
172 }
101 body->appendChild(media.release()); 173 body->appendChild(media.release());
102 174
103 rootElement->appendChild(head.release()); 175 rootElement->appendChild(head.release());
104 rootElement->appendChild(body.release()); 176 rootElement->appendChild(body.release());
105 177
106 m_didBuildDocumentStructure = true; 178 m_didBuildDocumentStructure = true;
107 } 179 }
108 180
109 void MediaDocumentParser::appendBytes(const char*, size_t) 181 void MediaDocumentParser::appendBytes(const char*, size_t)
110 { 182 {
111 if (m_didBuildDocumentStructure) 183 if (m_didBuildDocumentStructure)
112 return; 184 return;
113 185
114 LocalFrame* frame = document()->frame(); 186 LocalFrame* frame = document()->frame();
115 if (!frame->loader().client()->allowMedia(document()->url())) 187 if (!frame->loader().client()->allowMedia(document()->url()))
116 return; 188 return;
117 189
118 createDocumentStructure(); 190 createDocumentStructure();
119 finish(); 191 finish();
120 } 192 }
121 193
194 bool MediaEventListener::operator==(const EventListener& listener) const
195 {
196 if (const MediaEventListener* mediaEventListener = MediaEventListener::cast( &listener))
197 return m_doc == mediaEventListener->m_doc;
198 return false;
199 }
200
122 MediaDocument::MediaDocument(const DocumentInit& initializer) 201 MediaDocument::MediaDocument(const DocumentInit& initializer)
123 : HTMLDocument(initializer, MediaDocumentClass) 202 : HTMLDocument(initializer, MediaDocumentClass)
124 { 203 {
125 setCompatibilityMode(QuirksMode); 204 setCompatibilityMode(QuirksMode);
126 lockCompatibilityMode(); 205 lockCompatibilityMode();
127 } 206 }
128 207
129 PassRefPtrWillBeRawPtr<DocumentParser> MediaDocument::createParser() 208 PassRefPtrWillBeRawPtr<DocumentParser> MediaDocument::createParser()
130 { 209 {
131 return MediaDocumentParser::create(this); 210 return MediaDocumentParser::create(this);
(...skipping 12 matching lines...) Expand all
144 223
145 KeyboardEvent* keyboardEvent = toKeyboardEvent(event); 224 KeyboardEvent* keyboardEvent = toKeyboardEvent(event);
146 if (keyboardEvent->keyIdentifier() == "U+0020" || keyboardEvent->keyCode () == VKEY_MEDIA_PLAY_PAUSE) { 225 if (keyboardEvent->keyIdentifier() == "U+0020" || keyboardEvent->keyCode () == VKEY_MEDIA_PLAY_PAUSE) {
147 // space or media key (play/pause) 226 // space or media key (play/pause)
148 video->togglePlayState(); 227 video->togglePlayState();
149 event->setDefaultHandled(); 228 event->setDefaultHandled();
150 } 229 }
151 } 230 }
152 } 231 }
153 232
233 void MediaDocument::updateLayout()
esprehn 2016/03/11 00:35:33 updateLayout is a real method you're shadowing, yo
qinmin 2016/03/11 23:50:55 removed
234 {
235 HTMLAnchorElement* anchorElement = Traversal<HTMLAnchorElement>::firstWithin (*this);
236 HTMLMediaElement* mediaElement = Traversal<HTMLMediaElement>::firstWithin(*t his);
237
238 int top = mediaElement->offsetTop() + mediaElement->offsetHeight() + 36;
esprehn 2016/03/11 00:35:33 this doesn't seem right, what is 36? This seems re
qinmin 2016/03/11 23:50:55 This should actually be 32. It is to move the butt
239 anchorElement->setInlineStyleProperty(CSSPropertyTop, top, CSSPrimitiveValue ::UnitType::Pixels);
240 anchorElement->setInlineStyleProperty(CSSPropertyMarginTop, 0, CSSPrimitiveV alue::UnitType::Pixels);
esprehn 2016/03/11 00:35:32 huh? why always set to 0?
qinmin 2016/03/11 23:50:55 This is margin top. Since both the video and ancho
241 }
242
154 } // namespace blink 243 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/html/MediaDocument.h ('k') | third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698