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

Unified Diff: Source/web/WebLocalFrameImpl.cpp

Issue 316053007: Navigation transitions: Added notifyTransitionsShown and setupTransitionsView to WebLocalFrame (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: Source/web/WebLocalFrameImpl.cpp
diff --git a/Source/web/WebLocalFrameImpl.cpp b/Source/web/WebLocalFrameImpl.cpp
index 0f7d09def92a947eb0c685d170f8c73e68a76815..0fb4249dace951bbd3a2d50e7fc359a7a1caa4e0 100644
--- a/Source/web/WebLocalFrameImpl.cpp
+++ b/Source/web/WebLocalFrameImpl.cpp
@@ -1295,6 +1295,58 @@ void WebLocalFrameImpl::addStyleSheetByURL(const WebString& url)
frame()->document()->head()->appendChild(styleElement.release(), IGNORE_EXCEPTION);
}
+void WebLocalFrameImpl::notifyTransitionShown(int elementsToHide)
abarth-chromium 2014/06/13 17:29:01 This is way too much logic for WebLocalFrameImpl.
+{
+ RefPtr<HTMLCollection> metaElements = frame()->document()->getElementsByTagName(HTMLNames::metaTag.localName());
esprehn 2014/06/13 08:55:20 We don't use node lists of querySelector inside So
oystein (OOO til 10th of July) 2014/06/18 23:37:41 Somewhat improved now. Is it worth using ::inserte
+ if (elementsToHide >= 0) {
+ int currentValidTransitionElementsTag = 0;
+ unsigned length = metaElements->length();
esprehn 2014/06/13 08:55:20 Touching length() walks the entire document, then
oystein (OOO til 10th of July) 2014/06/18 23:37:42 Done.
+ for (unsigned i = 0; i < length; ++i) {
+ ASSERT(metaElements->item(i)->isHTMLElement());
+ HTMLMetaElement* metaElement = toHTMLMetaElement(metaElements->item(i));
+ if (metaElement->name() != "transition-elements")
+ continue;
+
+ Vector<String> tokens;
+ String(metaElement->content().impl()).split(';', tokens);
esprehn 2014/06/13 08:55:20 metaElement->content().string().split(...)
oystein (OOO til 10th of July) 2014/06/18 23:37:42 Done.
+ if (tokens.size() != 2)
+ continue;
+
+ TrackExceptionState exceptionState;
+ RefPtr<NodeList> nodeList = frame()->document()->querySelectorAll(AtomicString(tokens[0]), exceptionState);
+ if (nodeList && !exceptionState.hadException()) {
+ unsigned nodeListLength = nodeList->length();
+ if (nodeListLength && elementsToHide != currentValidTransitionElementsTag++)
+ continue;
+
+ for (unsigned nodeIdx = 0; nodeIdx < nodeListLength; ++nodeIdx) {
+ Node* node = nodeList->item(nodeIdx);
+ toElement(node)->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone);
esprehn 2014/06/13 08:55:19 Modifying parts of the page like this doesn't seem
oystein (OOO til 10th of July) 2014/06/18 23:37:41 Is there a better way of hiding these elements?
+ }
+ }
+ }
+ }
+
+ frame()->loader().closeURL();
+ frame()->document()->setIsTransitionDocument();
+ frame()->document()->styleEngine()->enableExitTransitionStylesheets();
esprehn 2014/06/13 08:55:19 You can't do this, closeURL() shuts the FrameLoade
oystein (OOO til 10th of July) 2014/06/18 23:37:41 I believe dispatching the unload events first was
+}
+
+void WebLocalFrameImpl::setupTransitionView(const WebString& markup)
+{
+ RefPtr<Document> ownerDocument(frame()->document());
+
+ // Need this so that the transition UA stylesheet gets applied.
+ frame()->document()->setIsTransitionDocument();
+ frame()->document()->enforceSandboxFlags(SandboxAll);
abarth-chromium 2014/06/13 17:29:01 Can you assert that document()->securityOrigin()->
oystein (OOO til 10th of July) 2014/06/18 23:37:41 Done, though I'm not quite sure what I'm doing her
+ frame()->page()->settings().setScriptEnabled(false);
abarth-chromium 2014/06/13 17:29:01 This line is redundant with enforceSandboxFlags(Sa
oystein (OOO til 10th of July) 2014/06/18 23:37:41 Done.
+
+ // FIXME(oysteine): Is there a better way to set this? Or should this HTML be an embedded resource?
+ // It could alternatively be generated in markup.cpp and included in |markup|.
+ String tempMarkup = String("<!DOCTYPE html><meta name=\"viewport\" content=\"width=device-width, user-scalable=0\">") + String(markup);
esprehn 2014/06/13 08:55:20 You should talk to abarth@ about this.
abarth-chromium 2014/06/13 17:29:01 This should be included in |markup|. I'm not sure
oystein (OOO til 10th of July) 2014/06/18 23:37:42 Done.
+ frame()->document()->loader()->replaceDocument(tempMarkup, ownerDocument.get());
+}
abarth-chromium 2014/06/13 17:29:01 All this logic should be in core also.
+
void WebLocalFrameImpl::setCaretVisible(bool visible)
{
frame()->selection().setCaretVisible(visible);

Powered by Google App Engine
This is Rietveld 408576698