WebPage::WebPage(uint64_t pageID, const IntSize& viewSize, const WebPreferencesStore& store, DrawingArea::Type drawingAreaType) : m_page(new Page(new WebChromeClient(this), new WebContextMenuClient(this), new WebEditorClient(this), new WebDragClient(this), new WebInspectorClient(this), 0, 0, 0)) , m_viewSize(viewSize) , m_drawingArea(DrawingArea::create(drawingAreaType, this)) , m_canGoBack(false) , m_canGoForward(false) , m_pageID(pageID) { ASSERT(m_pageID); m_page->settings()->setJavaScriptEnabled(store.javaScriptEnabled); m_page->settings()->setLoadsImagesAutomatically(store.loadsImagesAutomatically); m_page->settings()->setMinimumFontSize(store.minimumFontSize); m_page->settings()->setMinimumLogicalFontSize(store.minimumLogicalFontSize); m_page->settings()->setDefaultFontSize(store.defaultFontSize); m_page->settings()->setDefaultFixedFontSize(store.defaultFixedFontSize); m_page->settings()->setStandardFontFamily(store.standardFontFamily); m_page->settings()->setCursiveFontFamily(store.cursiveFontFamily); m_page->settings()->setFantasyFontFamily(store.fantasyFontFamily); m_page->settings()->setFixedFontFamily(store.fixedFontFamily); m_page->settings()->setSansSerifFontFamily(store.sansSerifFontFamily); m_page->settings()->setSerifFontFamily(store.serifFontFamily); platformInitialize(); m_mainFrame = WebFrame::createMainFrame(this); WebProcess::shared().connection()->send(WebPageProxyMessage::DidCreateMainFrame, m_pageID, CoreIPC::In(m_mainFrame->frameID())); if (WebProcess::shared().injectedBundle()) WebProcess::shared().injectedBundle()->didCreatePage(this); #ifndef NDEBUG webPageCounter.increment(); #endif }
JSLazyEventListener::JSLazyEventListener(const String& functionName, const String& eventParameterName, const String& code, Node* node, const String& sourceURL, int lineNumber) : JSEventListener(0, true) , m_functionName(functionName) , m_eventParameterName(eventParameterName) , m_code(code) , m_parsed(false) , m_sourceURL(sourceURL) , m_lineNumber(lineNumber) , m_originalNode(node) { // We don't retain the original node because we assume it // will stay alive as long as this handler object is around // and we need to avoid a reference cycle. If JS transfers // this handler to another node, parseCode will be called and // then originalNode is no longer needed. // A JSLazyEventListener can be created with a line number of zero when it is created with // a setAttribute call from JavaScript, so make the line number 1 in that case. if (m_lineNumber == 0) m_lineNumber = 1; #ifndef NDEBUG eventListenerCounter.increment(); #endif }
WebFrame::WebFrame(WebPage* page, const String& frameName, HTMLFrameOwnerElement* ownerElement) : m_page(page) , m_coreFrame(0) , m_policyListenerID(0) , m_policyFunction(0) , m_frameLoaderClient(this) , m_frameID(generateFrameID()) { // Add explict ref() that will be balanced in WebFrameLoaderClient::frameLoaderDestroyed(). ref(); m_page->addWebFrame(m_frameID, this); RefPtr<Frame> frame = Frame::create(page->corePage(), ownerElement, &m_frameLoaderClient); m_coreFrame = frame.get(); frame->tree()->setName(frameName); if (ownerElement) { ASSERT(ownerElement->document()->frame()); ownerElement->document()->frame()->tree()->appendChild(frame); } frame->init(); #ifndef NDEBUG webFrameCounter.increment(); #endif }
WebPage::~WebPage() { ASSERT(!m_page); #ifndef NDEBUG webPageCounter.decrement(); #endif }
JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback(JSObject* callback, JSDOMGlobalObject* globalObject) : m_data(new JSCallbackData(callback, globalObject)) { #ifndef NDEBUG counter.increment(); #endif }
CachedPage::CachedPage(Page* page) : m_timeStamp(0) , m_document(page->mainFrame()->document()) , m_view(page->mainFrame()->view()) , m_mousePressNode(page->mainFrame()->eventHandler()->mousePressNode()) , m_URL(page->mainFrame()->loader()->url()) { #ifndef NDEBUG cachedPageCounter.increment(); #endif m_document->documentWillBecomeInactive(); Frame* mainFrame = page->mainFrame(); mainFrame->clearTimers(); JSLock lock(false); ScriptController* proxy = mainFrame->script(); if (proxy->haveWindowShell()) { m_window = proxy->windowShell()->window(); m_window->pauseTimeouts(m_pausedTimeouts); } m_document->setInPageCache(true); }
WebFrame::WebFrame(WebPage* page, const String& frameName, HTMLFrameOwnerElement* ownerElement) : m_coreFrame(0) , m_policyListenerID(0) , m_policyFunction(0) , m_frameLoaderClient(this) , m_loadListener(0) , m_frameID(generateFrameID()) { WebProcess::shared().addWebFrame(m_frameID, this); RefPtr<Frame> frame = Frame::create(page->corePage(), ownerElement, &m_frameLoaderClient); m_coreFrame = frame.get(); frame->tree()->setName(frameName); if (ownerElement) { ASSERT(ownerElement->document()->frame()); ownerElement->document()->frame()->tree()->appendChild(frame); } frame->init(); #ifndef NDEBUG webFrameCounter.increment(); #endif }
JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback(JSObject* callback, Frame* frame) : m_data(new Data(callback, frame)) { #ifndef NDEBUG counter.increment(); #endif }
CachedPage::CachedPage(Page* page) : m_timeStamp(currentTime()) , m_cachedMainFrame(CachedFrame::create(page->mainFrame())) { #ifndef NDEBUG cachedPageCounter.increment(); #endif }
CachedPage::~CachedPage() { #ifndef NDEBUG cachedPageCounter.decrement(); #endif clear(); }
WebFrame::~WebFrame() { ASSERT(!m_coreFrame); #ifndef NDEBUG webFrameCounter.decrement(); #endif }
JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback() { callOnMainThread(deleteData, m_data); #ifndef NDEBUG m_data = 0; counter.decrement(); #endif }
CachedPage::~CachedPage() { #ifndef NDEBUG cachedPageCounter.decrement(); #endif destroy(); ASSERT(!m_cachedMainFrame); }
CachedPage::CachedPage(Page* page) : m_timeStamp(currentTime()) , m_cachedMainFrame(CachedFrame::create(page->mainFrame())) , m_needStyleRecalcForVisitedLinks(false) { #ifndef NDEBUG cachedPageCounter.increment(); #endif }
SubresourceLoader::SubresourceLoader(Frame* frame, SubresourceLoaderClient* client, bool sendResourceLoadCallbacks, bool shouldContentSniff) : ResourceLoader(frame, sendResourceLoadCallbacks, shouldContentSniff) , m_client(client) , m_loadingMultipartContent(false) { #ifndef NDEBUG subresourceLoaderCounter.increment(); #endif }
JSEventListener::~JSEventListener() { if (m_listener && m_window) { JSDOMWindow::ListenersMap& listeners = isHTMLEventListener() ? m_window->jsHTMLEventListeners() : m_window->jsEventListeners(); listeners.remove(m_listener); } #ifndef NDEBUG eventListenerCounter.decrement(); #endif }
SVGElementInstance::~SVGElementInstance() { #ifndef NDEBUG instanceCounter.decrement(); #endif // Deregister as instance for passed element. m_element->removeInstanceMapping(this); clearChildren(); }
SVGElementInstance::~SVGElementInstance() { #ifndef NDEBUG instanceCounter.decrement(); #endif // Deregister as instance for passed element. m_element->removeInstanceMapping(this); removeAllChildrenInContainer<SVGElementInstance, SVGElementInstance>(this); }
WebPageProxy::WebPageProxy(WebPageNamespace* pageNamespace, uint64_t pageID) : m_pageNamespace(pageNamespace) , m_mainFrame(0) , m_canGoBack(false) , m_canGoForward(false) , m_valid(true) , m_closed(false) , m_pageID(pageID) { #ifndef NDEBUG webPageProxyCounter.increment(); #endif }
JSEventListener::JSEventListener(JSObject* listener, JSDOMWindow* window, bool isHTML) : JSAbstractEventListener(isHTML) , m_listener(listener) , m_window(window) { if (m_listener) { JSDOMWindow::ListenersMap& listeners = isHTML ? m_window->jsHTMLEventListeners() : m_window->jsEventListeners(); listeners.set(m_listener, this); } #ifndef NDEBUG eventListenerCounter.increment(); #endif }
namespace WebCore { #ifndef NDEBUG static WTF::RefCountedLeakCounter cachedPageCounter("CachedPage"); #endif PassRefPtr<CachedPage> CachedPage::create(Page* page) { return adoptRef(new CachedPage(page)); } CachedPage::CachedPage(Page* page) : m_timeStamp(currentTime()) , m_cachedMainFrame(CachedFrame::create(page->mainFrame())) { #ifndef NDEBUG cachedPageCounter.increment(); #endif } CachedPage::~CachedPage() { #ifndef NDEBUG cachedPageCounter.decrement(); #endif clear(); } void CachedPage::restore(Page* page) { ASSERT(page && page->mainFrame()); m_cachedMainFrame->restore(page->mainFrame()); // Restore the focus appearance for the focused element. // FIXME: Right now we don't support pages w/ frames in the b/f cache. This may need to be tweaked when we add support for that. Document* focusedDocument = page->focusController()->focusedOrMainFrame()->document(); if (Node* node = focusedDocument->focusedNode()) { if (node->isElementNode()) static_cast<Element*>(node)->updateFocusAppearance(true); } } void CachedPage::clear() { m_cachedMainFrame.clear(); } } // namespace WebCore
WebFrame::WebFrame() : m_coreFrame(0) , m_policyListenerID(0) , m_policyFunction(0) , m_policyDownloadID(0) , m_frameLoaderClient(this) , m_loadListener(0) , m_frameID(generateFrameID()) { WebProcess::shared().addWebFrame(m_frameID, this); #ifndef NDEBUG webFrameCounter.increment(); #endif }
SVGElementInstance::SVGElementInstance(SVGUseElement* useElement, SVGElement* originalElement) : m_needsUpdate(false) , m_useElement(useElement) , m_element(originalElement) , m_previousSibling(0) , m_nextSibling(0) , m_firstChild(0) , m_lastChild(0) { ASSERT(m_useElement); ASSERT(m_element); // Register as instance for passed element. m_element->mapInstanceToElement(this); #ifndef NDEBUG instanceCounter.increment(); #endif }
SVGElementInstance::SVGElementInstance(SVGUseElement* correspondingUseElement, SVGUseElement* directUseElement, PassRefPtr<SVGElement> originalElement) : m_correspondingUseElement(correspondingUseElement) , m_directUseElement(directUseElement) , m_element(originalElement) , m_previousSibling(0) , m_nextSibling(0) , m_firstChild(0) , m_lastChild(0) { ASSERT(m_correspondingUseElement); ASSERT(m_element); // Register as instance for passed element. m_element->mapInstanceToElement(this); #ifndef NDEBUG instanceCounter.increment(); #endif }
Page::Page(ChromeClient* chromeClient, ContextMenuClient* contextMenuClient, EditorClient* editorClient, DragClient* dragClient, InspectorClient* inspectorClient) : m_chrome(new Chrome(this, chromeClient)) , m_dragCaretController(new SelectionController(0, true)) , m_dragController(new DragController(this, dragClient)) , m_focusController(new FocusController(this)) , m_contextMenuController(new ContextMenuController(this, contextMenuClient)) , m_inspectorController(new InspectorController(this, inspectorClient)) , m_settings(new Settings(this)) , m_progress(new ProgressTracker) , m_backForwardList(BackForwardList::create(this)) , m_editorClient(editorClient) , m_frameCount(0) , m_tabKeyCyclesThroughElements(true) , m_defersLoading(false) , m_inLowQualityInterpolationMode(false) , m_parentInspectorController(0) , m_didLoadUserStyleSheet(false) , m_userStyleSheetModificationTime(0) , m_group(0) , m_debugger(0) , m_pendingUnloadEventCount(0) , m_pendingBeforeUnloadEventCount(0) , m_customHTMLTokenizerTimeDelay(-1) , m_customHTMLTokenizerChunkSize(-1) { if (!allPages) { allPages = new HashSet<Page*>; setFocusRingColorChangeFunction(setNeedsReapplyStyles); networkStateNotifier().setNetworkStateChangedFunction(networkStateChanged); } ASSERT(!allPages->contains(this)); allPages->add(this); JavaScriptDebugServer::shared().pageCreated(this); #ifndef NDEBUG pageCounter.increment(); #endif }
namespace WebCore { using namespace JSC; #ifndef NDEBUG static WTF::RefCountedLeakCounter counter("JSCustomSQLTransactionCallback"); #endif JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback(JSObject* callback, JSDOMGlobalObject* globalObject) : m_data(new JSCallbackData(callback, globalObject)) { #ifndef NDEBUG counter.increment(); #endif } JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback() { callOnMainThread(JSCallbackData::deleteData, m_data); #ifndef NDEBUG m_data = 0; counter.decrement(); #endif } void JSCustomSQLTransactionCallback::handleEvent(SQLTransaction* transaction, bool& raisedException) { ASSERT(m_data); RefPtr<JSCustomSQLTransactionCallback> protect(this); JSC::JSLock lock(SilenceAssertionsOnly); ExecState* exec = m_data->globalObject()->globalExec(); MarkedArgumentBuffer args; args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), transaction)); m_data->invokeCallback(args, &raisedException); } }
Page::~Page() { m_mainFrame->setView(0); setGroupName(String()); allPages->remove(this); for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) frame->pageDestroyed(); m_editorClient->pageDestroyed(); if (m_parentInspectorController) m_parentInspectorController->pageDestroyed(); m_inspectorController->inspectedPageDestroyed(); m_backForwardList->close(); #ifndef NDEBUG pageCounter.decrement(); // Cancel keepAlive timers, to ensure we release all Frames before exiting. // It's safe to do this because we prohibit closing a Page while JavaScript // is executing. Frame::cancelAllKeepAlive(); #endif }
namespace WebCore { using namespace JSC; #ifndef NDEBUG static WTF::RefCountedLeakCounter counter("JSCustomSQLTransactionCallback"); #endif // We have to clean up the data on the main thread for two reasons: // // 1) Can't deref a Frame on a non-main thread. // 2) Unprotecting the JSObject on a non-main thread would register that thread // for JavaScript garbage collection, which could unnecessarily slow things down. class JSCustomSQLTransactionCallback::Data { public: Data(JSObject* callback, Frame* frame) : m_callback(callback), m_frame(frame) { } JSObject* callback() { return m_callback; } Frame* frame() { return m_frame.get(); } private: ProtectedPtr<JSObject> m_callback; RefPtr<Frame> m_frame; }; JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback(JSObject* callback, Frame* frame) : m_data(new Data(callback, frame)) { #ifndef NDEBUG counter.increment(); #endif } void JSCustomSQLTransactionCallback::deleteData(void* context) { delete static_cast<Data*>(context); } JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback() { callOnMainThread(deleteData, m_data); #ifndef NDEBUG m_data = 0; counter.decrement(); #endif } void JSCustomSQLTransactionCallback::handleEvent(SQLTransaction* transaction, bool& raisedException) { ASSERT(m_data); ASSERT(m_data->callback()); ASSERT(m_data->frame()); if (!m_data->frame()->script()->isEnabled()) return; JSGlobalObject* globalObject = m_data->frame()->script()->globalObject(); ExecState* exec = globalObject->globalExec(); JSC::JSLock lock(false); JSValue* handleEventFunction = m_data->callback()->get(exec, Identifier(exec, "handleEvent")); CallData handleEventCallData; CallType handleEventCallType = handleEventFunction->getCallData(handleEventCallData); CallData callbackCallData; CallType callbackCallType = CallTypeNone; if (handleEventCallType == CallTypeNone) { callbackCallType = m_data->callback()->getCallData(callbackCallData); if (callbackCallType == CallTypeNone) { // FIXME: Should an exception be thrown here? return; } } RefPtr<JSCustomSQLTransactionCallback> protect(this); ArgList args; args.append(toJS(exec, transaction)); globalObject->startTimeoutCheck(); if (handleEventCallType != CallTypeNone) call(exec, handleEventFunction, handleEventCallType, handleEventCallData, m_data->callback(), args); else call(exec, m_data->callback(), callbackCallType, callbackCallData, m_data->callback(), args); globalObject->stopTimeoutCheck(); if (exec->hadException()) { m_data->frame()->domWindow()->console()->reportCurrentException(exec); raisedException = true; } Document::updateDocumentsRendering(); } }
namespace WebKit { #ifndef NDEBUG static WTF::RefCountedLeakCounter webFrameCounter("WebFrame"); #endif static uint64_t generateFrameID() { static uint64_t uniqueFrameID = 1; return uniqueFrameID++; } static uint64_t generateListenerID() { static uint64_t uniqueListenerID = 1; return uniqueListenerID++; } PassRefPtr<WebFrame> WebFrame::createMainFrame(WebPage* page) { RefPtr<WebFrame> frame = create(); page->send(Messages::WebPageProxy::DidCreateMainFrame(frame->frameID())); frame->init(page, String(), 0); return frame.release(); } PassRefPtr<WebFrame> WebFrame::createSubframe(WebPage* page, const String& frameName, HTMLFrameOwnerElement* ownerElement) { RefPtr<WebFrame> frame = create(); WebFrame* parentFrame = static_cast<WebFrameLoaderClient*>(ownerElement->document()->frame()->loader()->client())->webFrame(); page->send(Messages::WebPageProxy::DidCreateSubframe(frame->frameID(), parentFrame->frameID())); frame->init(page, frameName, ownerElement); return frame.release(); } PassRefPtr<WebFrame> WebFrame::create() { RefPtr<WebFrame> frame = adoptRef(new WebFrame); // Add explict ref() that will be balanced in WebFrameLoaderClient::frameLoaderDestroyed(). frame->ref(); return frame.release(); } WebFrame::WebFrame() : m_coreFrame(0) , m_policyListenerID(0) , m_policyFunction(0) , m_policyDownloadID(0) , m_frameLoaderClient(this) , m_loadListener(0) , m_frameID(generateFrameID()) { WebProcess::shared().addWebFrame(m_frameID, this); #ifndef NDEBUG webFrameCounter.increment(); #endif } WebFrame::~WebFrame() { ASSERT(!m_coreFrame); #ifndef NDEBUG webFrameCounter.decrement(); #endif } void WebFrame::init(WebPage* page, const String& frameName, HTMLFrameOwnerElement* ownerElement) { RefPtr<Frame> frame = Frame::create(page->corePage(), ownerElement, &m_frameLoaderClient); m_coreFrame = frame.get(); frame->tree()->setName(frameName); if (ownerElement) { ASSERT(ownerElement->document()->frame()); ownerElement->document()->frame()->tree()->appendChild(frame); } frame->init(); } WebPage* WebFrame::page() const { if (!m_coreFrame) return 0; if (WebCore::Page* page = m_coreFrame->page()) return static_cast<WebChromeClient*>(page->chrome()->client())->page(); return 0; } void WebFrame::invalidate() { WebProcess::shared().removeWebFrame(m_frameID); m_coreFrame = 0; } uint64_t WebFrame::setUpPolicyListener(WebCore::FramePolicyFunction policyFunction) { // FIXME: <rdar://5634381> We need to support multiple active policy listeners. invalidatePolicyListener(); m_policyListenerID = generateListenerID(); m_policyFunction = policyFunction; return m_policyListenerID; } void WebFrame::invalidatePolicyListener() { if (!m_policyListenerID) return; m_policyDownloadID = 0; m_policyListenerID = 0; m_policyFunction = 0; } void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t downloadID) { if (!m_coreFrame) return; if (!m_policyListenerID) return; if (listenerID != m_policyListenerID) return; ASSERT(m_policyFunction); FramePolicyFunction function = m_policyFunction; invalidatePolicyListener(); m_policyDownloadID = downloadID; (m_coreFrame->loader()->policyChecker()->*function)(action); } void WebFrame::startDownload(const WebCore::ResourceRequest& request) { ASSERT(m_policyDownloadID); DownloadManager::shared().startDownload(m_policyDownloadID, page(), request); m_policyDownloadID = 0; } void WebFrame::convertHandleToDownload(ResourceHandle* handle, const ResourceRequest& request, const ResourceRequest& initialRequest, const ResourceResponse& response) { ASSERT(m_policyDownloadID); DownloadManager::shared().convertHandleToDownload(m_policyDownloadID, page(), handle, request, initialRequest, response); m_policyDownloadID = 0; } String WebFrame::source() const { if (!m_coreFrame) return String(); Document* document = m_coreFrame->document(); if (!document) return String(); TextResourceDecoder* decoder = document->decoder(); if (!decoder) return String(); DocumentLoader* documentLoader = m_coreFrame->loader()->activeDocumentLoader(); if (!documentLoader) return String(); RefPtr<SharedBuffer> mainResourceData = documentLoader->mainResourceData(); if (!mainResourceData) return String(); return decoder->encoding().decode(mainResourceData->data(), mainResourceData->size()); } String WebFrame::contentsAsString() const { if (!m_coreFrame) return String(); if (isFrameSet()) { StringBuilder builder; for (Frame* child = m_coreFrame->tree()->firstChild(); child; child = child->tree()->nextSibling()) { if (!builder.isEmpty()) builder.append(' '); builder.append(static_cast<WebFrameLoaderClient*>(child->loader()->client())->webFrame()->contentsAsString()); } // FIXME: It may make sense to use toStringPreserveCapacity() here. return builder.toString(); } Document* document = m_coreFrame->document(); if (!document) return String(); RefPtr<Element> documentElement = document->documentElement(); if (!documentElement) return String(); RefPtr<Range> range = document->createRange(); ExceptionCode ec = 0; range->selectNode(documentElement.get(), ec); if (ec) return String(); return plainText(range.get()); } String WebFrame::selectionAsString() const { if (!m_coreFrame) return String(); return m_coreFrame->displayStringModifiedByEncoding(m_coreFrame->editor()->selectedText()); } IntSize WebFrame::size() const { if (!m_coreFrame) return IntSize(); FrameView* frameView = m_coreFrame->view(); if (!frameView) return IntSize(); return frameView->contentsSize(); } bool WebFrame::isFrameSet() const { if (!m_coreFrame) return false; Document* document = m_coreFrame->document(); if (!document) return false; return document->isFrameSet(); } bool WebFrame::isMainFrame() const { if (WebPage* p = page()) return p->mainFrame() == this; return false; } String WebFrame::name() const { if (!m_coreFrame) return String(); return m_coreFrame->tree()->uniqueName(); } String WebFrame::url() const { if (!m_coreFrame) return String(); DocumentLoader* documentLoader = m_coreFrame->loader()->documentLoader(); if (!documentLoader) return String(); return documentLoader->url().string(); } String WebFrame::innerText() const { if (!m_coreFrame) return String(); if (!m_coreFrame->document()->documentElement()) return String(); return m_coreFrame->document()->documentElement()->innerText(); } PassRefPtr<ImmutableArray> WebFrame::childFrames() { if (!m_coreFrame) return ImmutableArray::create(); size_t size = m_coreFrame->tree()->childCount(); if (!size) return ImmutableArray::create(); Vector<RefPtr<APIObject> > vector; vector.reserveInitialCapacity(size); for (Frame* child = m_coreFrame->tree()->firstChild(); child; child = child->tree()->nextSibling()) { WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(child->loader()->client())->webFrame(); vector.uncheckedAppend(webFrame); } return ImmutableArray::adopt(vector); } unsigned WebFrame::numberOfActiveAnimations() const { if (!m_coreFrame) return 0; AnimationController* controller = m_coreFrame->animation(); if (!controller) return 0; return controller->numberOfActiveAnimations(); } bool WebFrame::pauseAnimationOnElementWithId(const String& animationName, const String& elementID, double time) { if (!m_coreFrame) return false; AnimationController* controller = m_coreFrame->animation(); if (!controller) return false; if (!m_coreFrame->document()) return false; Node* coreNode = m_coreFrame->document()->getElementById(elementID); if (!coreNode || !coreNode->renderer()) return false; return controller->pauseAnimationAtTime(coreNode->renderer(), animationName, time); } void WebFrame::suspendAnimations() { if (!m_coreFrame) return; AnimationController* controller = m_coreFrame->animation(); if (!controller) return; controller->suspendAnimations(); } void WebFrame::resumeAnimations() { if (!m_coreFrame) return; AnimationController* controller = m_coreFrame->animation(); if (!controller) return; controller->resumeAnimations(); } String WebFrame::layerTreeAsText() const { if (!m_coreFrame) return ""; return m_coreFrame->layerTreeAsText(); } unsigned WebFrame::pendingUnloadCount() const { if (!m_coreFrame) return 0; return m_coreFrame->domWindow()->pendingUnloadEventListeners(); } bool WebFrame::allowsFollowingLink(const WebCore::KURL& url) const { if (!m_coreFrame) return true; return m_coreFrame->document()->securityOrigin()->canDisplay(url); } JSGlobalContextRef WebFrame::jsContext() { return toGlobalRef(m_coreFrame->script()->globalObject(mainThreadNormalWorld())->globalExec()); } JSGlobalContextRef WebFrame::jsContextForWorld(InjectedBundleScriptWorld* world) { return toGlobalRef(m_coreFrame->script()->globalObject(world->coreWorld())->globalExec()); } IntRect WebFrame::contentBounds() const { if (!m_coreFrame) return IntRect(); FrameView* view = m_coreFrame->view(); if (!view) return IntRect(); return IntRect(0, 0, view->contentsWidth(), view->contentsHeight()); } IntRect WebFrame::visibleContentBounds() const { if (!m_coreFrame) return IntRect(); FrameView* view = m_coreFrame->view(); if (!view) return IntRect(); IntRect contentRect = view->visibleContentRect(true); return IntRect(0, 0, contentRect.width(), contentRect.height()); } IntRect WebFrame::visibleContentBoundsExcludingScrollbars() const { if (!m_coreFrame) return IntRect(); FrameView* view = m_coreFrame->view(); if (!view) return IntRect(); IntRect contentRect = view->visibleContentRect(false); return IntRect(0, 0, contentRect.width(), contentRect.height()); } IntSize WebFrame::scrollOffset() const { if (!m_coreFrame) return IntSize(); FrameView* view = m_coreFrame->view(); if (!view) return IntSize(); return view->scrollOffset(); } bool WebFrame::hasHorizontalScrollbar() const { if (!m_coreFrame) return false; FrameView* view = m_coreFrame->view(); if (!view) return false; return view->horizontalScrollbar(); } bool WebFrame::hasVerticalScrollbar() const { if (!m_coreFrame) return false; FrameView* view = m_coreFrame->view(); if (!view) return false; return view->verticalScrollbar(); } bool WebFrame::getDocumentBackgroundColor(double* red, double* green, double* blue, double* alpha) { if (!m_coreFrame) return false; Document* document = m_coreFrame->document(); if (!document) return false; Element* rootElementToUse = document->body(); if (!rootElementToUse) rootElementToUse = document->documentElement(); if (!rootElementToUse) return false; RenderObject* renderer = rootElementToUse->renderer(); if (!renderer) return false; Color color = renderer->style()->visitedDependentColor(CSSPropertyBackgroundColor); if (!color.isValid()) return false; color.getRGBA(*red, *green, *blue, *alpha); return true; } WebFrame* WebFrame::frameForContext(JSContextRef context) { JSObjectRef globalObjectRef = JSContextGetGlobalObject(context); JSC::JSObject* globalObjectObj = toJS(globalObjectRef); if (strcmp(globalObjectObj->classInfo()->className, "JSDOMWindowShell") != 0) return 0; Frame* coreFrame = static_cast<JSDOMWindowShell*>(globalObjectObj)->window()->impl()->frame(); return static_cast<WebFrameLoaderClient*>(coreFrame->loader()->client())->webFrame(); } JSValueRef WebFrame::jsWrapperForWorld(InjectedBundleNodeHandle* nodeHandle, InjectedBundleScriptWorld* world) { JSDOMWindow* globalObject = m_coreFrame->script()->globalObject(world->coreWorld()); ExecState* exec = globalObject->globalExec(); JSLock lock(SilenceAssertionsOnly); return toRef(exec, toJS(exec, globalObject, nodeHandle->coreNode())); } JSValueRef WebFrame::jsWrapperForWorld(InjectedBundleRangeHandle* rangeHandle, InjectedBundleScriptWorld* world) { JSDOMWindow* globalObject = m_coreFrame->script()->globalObject(world->coreWorld()); ExecState* exec = globalObject->globalExec(); JSLock lock(SilenceAssertionsOnly); return toRef(exec, toJS(exec, globalObject, rangeHandle->coreRange())); } JSValueRef WebFrame::computedStyleIncludingVisitedInfo(JSObjectRef element) { if (!m_coreFrame) return 0; JSDOMWindow* globalObject = m_coreFrame->script()->globalObject(mainThreadNormalWorld()); ExecState* exec = globalObject->globalExec(); if (!toJS(element)->inherits(&JSElement::s_info)) return JSValueMakeUndefined(toRef(exec)); RefPtr<CSSComputedStyleDeclaration> style = computedStyle(static_cast<JSElement*>(toJS(element))->impl(), true); JSLock lock(SilenceAssertionsOnly); return toRef(exec, toJS(exec, globalObject, style.get())); } String WebFrame::counterValue(JSObjectRef element) { if (!toJS(element)->inherits(&JSElement::s_info)) return String(); return counterValueForElement(static_cast<JSElement*>(toJS(element))->impl()); } String WebFrame::markerText(JSObjectRef element) { if (!toJS(element)->inherits(&JSElement::s_info)) return String(); return markerTextForListItem(static_cast<JSElement*>(toJS(element))->impl()); } String WebFrame::provisionalURL() const { if (!m_coreFrame) return String(); return m_coreFrame->loader()->provisionalDocumentLoader()->url().string(); } String WebFrame::suggestedFilenameForResourceWithURL(const KURL& url) const { if (!m_coreFrame) return String(); DocumentLoader* loader = m_coreFrame->loader()->documentLoader(); if (!loader) return String(); // First, try the main resource. if (loader->url() == url) return loader->response().suggestedFilename(); // Next, try subresources. RefPtr<ArchiveResource> resource = loader->subresource(url); if (!resource) return String(); return resource->response().suggestedFilename(); } String WebFrame::mimeTypeForResourceWithURL(const KURL& url) const { if (!m_coreFrame) return String(); DocumentLoader* loader = m_coreFrame->loader()->documentLoader(); if (!loader) return String(); // First, try the main resource. if (loader->url() == url) return loader->response().mimeType(); // Next, try subresources. RefPtr<ArchiveResource> resource = loader->subresource(url); if (resource) return resource->mimeType(); return page()->cachedResponseMIMETypeForURL(url); } } // namespace WebKit
SubresourceLoader::~SubresourceLoader() { #ifndef NDEBUG subresourceLoaderCounter.decrement(); #endif }