void WebRemoteFrameImpl::initializeFromFrame(WebLocalFrame* source) const { ASSERT(source); WebLocalFrameImpl* localFrameImpl = toWebLocalFrameImpl(source); client()->initializeChildFrame( localFrameImpl->frame()->view()->frameRect(), localFrameImpl->frame()->view()->visibleContentScaleFactor()); }
void WebRemoteFrameImpl::initializeFromFrame(WebLocalFrame* source) const { DCHECK(source); WebLocalFrameImpl* localFrameImpl = toWebLocalFrameImpl(source); client()->initializeChildFrame( localFrameImpl->frame()->view()->frameRect(), localFrameImpl->frame()->page()->deviceScaleFactor()); }
bool WebPageSerializerImpl::serialize() { if (!m_framesCollected) collectTargetFrames(); bool didSerialization = false; KURL mainURL = m_specifiedWebLocalFrameImpl->frame()->document()->url(); for (unsigned i = 0; i < m_frames.size(); ++i) { WebLocalFrameImpl* webFrame = m_frames[i]; Document* document = webFrame->frame()->document(); const KURL& url = document->url(); if (!url.isValid() || !m_localLinks.contains(url.string())) continue; didSerialization = true; const WTF::TextEncoding& textEncoding = document->encoding().isValid() ? document->encoding() : UTF8Encoding(); String directoryName = url == mainURL ? m_localDirectoryName : ""; SerializeDomParam param(url, textEncoding, document, directoryName); Element* documentElement = document->documentElement(); if (documentElement) buildContentForNode(documentElement, ¶m); encodeAndFlushBuffer(WebPageSerializerClient::CurrentFrameIsFinished, ¶m, ForceFlush); } ASSERT(m_dataBuffer.isEmpty()); m_client->didSerializeDataForFrame(KURL(), WebCString("", 0), WebPageSerializerClient::AllFramesAreFinished); return didSerialization; }
void WebPageSerializerImpl::collectTargetFrames() { ASSERT(!m_framesCollected); m_framesCollected = true; // First, process main frame. m_frames.append(m_specifiedWebLocalFrameImpl); // Return now if user only needs to serialize specified frame, not including // all sub-frames. if (!m_recursiveSerialization) return; // Collect all frames inside the specified frame. for (int i = 0; i < static_cast<int>(m_frames.size()); ++i) { WebLocalFrameImpl* currentFrame = m_frames[i]; // Get current using document. Document* currentDoc = currentFrame->frame()->document(); // Go through sub-frames. RefPtrWillBeRawPtr<HTMLCollection> all = currentDoc->all(); for (unsigned i = 0; Element* element = all->item(i); ++i) { if (!element->isHTMLElement()) continue; WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrameOwnerElement(element); if (webFrame) m_frames.append(webFrame); } } }
bool WebPageSerializerImpl::serialize() { bool didSerialization = false; KURL mainURL = m_specifiedWebLocalFrameImpl->frame()->document()->url(); WebLocalFrameImpl* webFrame = m_specifiedWebLocalFrameImpl; Document* document = webFrame->frame()->document(); const KURL& url = document->url(); if (url.isValid() && m_localLinks.contains(url.string())) { didSerialization = true; const WTF::TextEncoding& textEncoding = document->encoding().isValid() ? document->encoding() : UTF8Encoding(); String directoryName = url == mainURL ? m_localDirectoryName : ""; SerializeDomParam param(url, textEncoding, document, directoryName); Element* documentElement = document->documentElement(); if (documentElement) buildContentForNode(documentElement, ¶m); encodeAndFlushBuffer(WebPageSerializerClient::CurrentFrameIsFinished, ¶m, ForceFlush); } else { // Report empty contents for invalid URLs. m_client->didSerializeDataForFrame( url, WebCString(), WebPageSerializerClient::CurrentFrameIsFinished); } ASSERT(m_dataBuffer.isEmpty()); return didSerialization; }
void WebRemoteFrameImpl::didStopLoading() { frame()->setIsLoading(false); if (parent() && parent()->isWebLocalFrame()) { WebLocalFrameImpl* parentFrame = toWebLocalFrameImpl(parent()->toWebLocalFrame()); parentFrame->frame()->loader().checkCompleted(); } }
void WebSharedWorkerImpl::loadShadowPage() { WebLocalFrameImpl* webFrame = toWebLocalFrameImpl(m_webView->mainFrame()); // Construct substitute data source for the 'shadow page'. We only need it // to have same origin as the worker so the loading checks work correctly. CString content(""); RefPtr<SharedBuffer> buffer(SharedBuffer::create(content.data(), content.length())); webFrame->frame()->loader().load(FrameLoadRequest(0, ResourceRequest(m_url), SubstituteData(buffer, "text/html", "UTF-8", KURL()))); }
WebLocalFrame* WebRemoteFrameImpl::createLocalChild(WebTreeScopeType scope, const WebString& name, const WebString& uniqueName, WebSandboxFlags sandboxFlags, WebFrameClient* client, WebFrame* previousSibling, const WebFrameOwnerProperties& frameOwnerProperties, WebFrame* opener) { WebLocalFrameImpl* child = WebLocalFrameImpl::create(scope, client, opener); insertAfter(child, previousSibling); RawPtr<RemoteFrameOwner> owner = RemoteFrameOwner::create(static_cast<SandboxFlags>(sandboxFlags), frameOwnerProperties); // FIXME: currently this calls LocalFrame::init() on the created LocalFrame, which may // result in the browser observing two navigations to about:blank (one from the initial // frame creation, and one from swapping it into the remote process). FrameLoader might // need a special initialization function for this case to avoid that duplicate navigation. child->initializeCoreFrame(frame()->host(), owner.get(), name, uniqueName); // Partially related with the above FIXME--the init() call may trigger JS dispatch. However, // if the parent is remote, it should never be detached synchronously... DCHECK(child->frame()); return child; }
WebLocalFrame* WebRemoteFrameImpl::createLocalChild(WebTreeScopeType scope, const WebString& name, WebSandboxFlags sandboxFlags, WebFrameClient* client, WebFrame* previousSibling, const WebFrameOwnerProperties& frameOwnerProperties) { WebLocalFrameImpl* child = toWebLocalFrameImpl(WebLocalFrame::create(scope, client)); WillBeHeapHashMap<WebFrame*, OwnPtrWillBeMember<FrameOwner>>::AddResult result = m_ownersForChildren.add(child, RemoteBridgeFrameOwner::create(child, static_cast<SandboxFlags>(sandboxFlags), frameOwnerProperties)); insertAfter(child, previousSibling); // FIXME: currently this calls LocalFrame::init() on the created LocalFrame, which may // result in the browser observing two navigations to about:blank (one from the initial // frame creation, and one from swapping it into the remote process). FrameLoader might // need a special initialization function for this case to avoid that duplicate navigation. child->initializeCoreFrame(frame()->host(), result.storedValue->value.get(), name, nullAtom); // Partially related with the above FIXME--the init() call may trigger JS dispatch. However, // if the parent is remote, it should never be detached synchronously... ASSERT(child->frame()); return child; }
bool WebPageSerializer::retrieveAllResources(WebView* view, const WebVector<WebCString>& supportedSchemes, WebVector<WebURL>* resourceURLs, WebVector<WebURL>* frameURLs) { WebLocalFrameImpl* mainFrame = toWebLocalFrameImpl(view->mainFrame()); if (!mainFrame) return false; Vector<LocalFrame*> framesToVisit; Vector<LocalFrame*> visitedFrames; Vector<KURL> frameKURLs; Vector<KURL> resourceKURLs; // Let's retrieve the resources from every frame in this page. framesToVisit.append(mainFrame->frame()); while (!framesToVisit.isEmpty()) { LocalFrame* frame = framesToVisit[0]; framesToVisit.remove(0); retrieveResourcesForFrame(frame, supportedSchemes, &visitedFrames, &framesToVisit, &frameKURLs, &resourceKURLs); } // Converts the results to WebURLs. WebVector<WebURL> resultResourceURLs(resourceKURLs.size()); for (size_t i = 0; i < resourceKURLs.size(); ++i) { resultResourceURLs[i] = resourceKURLs[i]; // A frame's src can point to the same URL as another resource, keep the // resource URL only in such cases. size_t index = frameKURLs.find(resourceKURLs[i]); if (index != kNotFound) frameKURLs.remove(index); } *resourceURLs = resultResourceURLs; WebVector<WebURL> resultFrameURLs(frameKURLs.size()); for (size_t i = 0; i < frameKURLs.size(); ++i) resultFrameURLs[i] = frameKURLs[i]; *frameURLs = resultFrameURLs; return true; }
void WebPageSerializerImpl::openTagToString(Element* element, SerializeDomParam* param) { bool needSkip; StringBuilder result; // Do pre action for open tag. result.append(preActionBeforeSerializeOpenTag(element, param, &needSkip)); if (needSkip) return; // Add open tag result.append('<'); result.append(element->nodeName().lower()); // Go through all attributes and serialize them. if (element->hasAttributes()) { unsigned numAttrs = element->attributeCount(); for (unsigned i = 0; i < numAttrs; i++) { result.append(' '); // Add attribute pair const Attribute& attribute = element->attributeItem(i); result.append(attribute.name().toString()); result.appendLiteral("=\""); if (!attribute.value().isEmpty()) { const String& attrValue = attribute.value(); // Check whether we need to replace some resource links // with local resource paths. const QualifiedName& attrName = attribute.name(); if (element->hasLegalLinkAttribute(attrName)) { // For links start with "javascript:", we do not change it. if (attrValue.startsWith("javascript:", false)) result.append(attrValue); else { // Get the absolute link WebLocalFrameImpl* subFrame = WebLocalFrameImpl::fromFrameOwnerElement(element); String completeURL = subFrame ? subFrame->frame()->document()->url() : param->document->completeURL(attrValue); // Check whether we have local files for those link. if (m_localLinks.contains(completeURL)) { if (!param->directoryName.isEmpty()) { result.appendLiteral("./"); result.append(param->directoryName); result.append('/'); } result.append(m_localLinks.get(completeURL)); } else result.append(completeURL); } } else { if (param->isHTMLDocument) result.append(m_htmlEntities.convertEntitiesInString(attrValue)); else result.append(m_xmlEntities.convertEntitiesInString(attrValue)); } } result.append('\"'); } } // Do post action for open tag. String addedContents = postActionAfterSerializeOpenTag(element, param); // Complete the open tag for element when it has child/children. if (element->hasChildren() || param->haveAddedContentsBeforeEnd) result.append('>'); // Append the added contents generate in post action of open tag. result.append(addedContents); // Save the result to data buffer. saveHTMLContentToBuffer(result.toString(), param); }
Frame* FrameLoaderClientImpl::lastChild() const { WebLocalFrameImpl* frame = toWebLocalFrameImpl(m_webFrame->lastChild()); return frame ? frame->frame() : 0; }
Frame* FrameLoaderClientImpl::nextSibling() const { WebLocalFrameImpl* frame = toWebLocalFrameImpl(m_webFrame->nextSibling()); return frame ? frame->frame() : 0; }
Frame* FrameLoaderClientImpl::parent() const { WebLocalFrameImpl* frame = toWebLocalFrameImpl(m_webFrame->parent()); return frame ? frame->frame() : 0; }
Frame* FrameLoaderClientImpl::opener() const { WebLocalFrameImpl* opener = toWebLocalFrameImpl(m_webFrame->opener()); return opener ? opener->frame() : 0; }
bool TextFinder::isActiveMatchFrameValid() const { WebLocalFrameImpl* mainFrameImpl = m_ownerFrame.viewImpl()->mainFrameImpl(); WebLocalFrameImpl* activeMatchFrame = mainFrameImpl->activeMatchFrame(); return activeMatchFrame && activeMatchFrame->activeMatch() && activeMatchFrame->frame()->tree().isDescendantOf(mainFrameImpl->frame()); }