diff options
Diffstat (limited to 'WebKit/chromium/src')
264 files changed, 20733 insertions, 12446 deletions
diff --git a/WebKit/chromium/src/ApplicationCacheHost.cpp b/WebKit/chromium/src/ApplicationCacheHost.cpp index 5fa4a66..a6e66c6 100644 --- a/WebKit/chromium/src/ApplicationCacheHost.cpp +++ b/WebKit/chromium/src/ApplicationCacheHost.cpp @@ -37,10 +37,15 @@ #include "DocumentLoader.h" #include "DOMApplicationCache.h" #include "Frame.h" +#include "InspectorApplicationCacheAgent.h" +#include "InspectorController.h" +#include "Page.h" +#include "ProgressEvent.h" #include "Settings.h" #include "WebURL.h" #include "WebURLError.h" #include "WebURLResponse.h" +#include "WebVector.h" #include "WrappedResourceRequest.h" #include "WrappedResourceResponse.h" @@ -103,11 +108,16 @@ void ApplicationCacheHost::selectCacheWithManifest(const KURL& manifestURL) // see WebCore::ApplicationCacheGroup::selectCache() const KURL& docURL = m_documentLoader->frame()->document()->url(); String referrer = m_documentLoader->frameLoader()->referrer(); - m_documentLoader->frame()->redirectScheduler()->scheduleLocationChange(docURL, referrer); + m_documentLoader->frame()->navigationScheduler()->scheduleLocationChange(docURL, referrer); } } } +void ApplicationCacheHost::maybeLoadMainResourceForRedirect(ResourceRequest&, SubstituteData&) +{ + // N/A to the chromium port +} + bool ApplicationCacheHost::maybeLoadFallbackForMainResponse(const ResourceRequest&, const ResourceResponse& response) { if (m_internal) { @@ -195,34 +205,82 @@ void ApplicationCacheHost::setDOMApplicationCache(DOMApplicationCache* domApplic m_domApplicationCache = domApplicationCache; } -void ApplicationCacheHost::notifyDOMApplicationCache(EventID id) +void ApplicationCacheHost::notifyDOMApplicationCache(EventID id, int total, int done) { +#if ENABLE(INSPECTOR) + // If host's frame is main frame and inspector frontend is connected, update appcache status. + if (id != PROGRESS_EVENT && m_documentLoader->frame()) { + Page* page = m_documentLoader->frame()->page(); + if (page && page->inspectorController()->applicationCacheAgent() && page->mainFrame() == m_documentLoader->frame()) + page->inspectorController()->applicationCacheAgent()->updateApplicationCacheStatus(status()); + } +#endif + if (m_defersEvents) { - m_deferredEvents.append(id); + // Event dispatching is deferred until document.onload has fired. + m_deferredEvents.append(DeferredEvent(id, total, done)); return; } - if (m_domApplicationCache) { - ExceptionCode ec = 0; - m_domApplicationCache->dispatchEvent(Event::create(DOMApplicationCache::toEventType(id), false, false), ec); - ASSERT(!ec); + dispatchDOMEvent(id, total, done); +} + +#if ENABLE(INSPECTOR) +ApplicationCacheHost::CacheInfo ApplicationCacheHost::applicationCacheInfo() +{ + if (!m_internal) + return CacheInfo(KURL(), 0, 0, 0); + + WebKit::WebApplicationCacheHost::CacheInfo webInfo; + m_internal->m_outerHost->getAssociatedCacheInfo(&webInfo); + return CacheInfo(webInfo.manifestURL, webInfo.creationTime, webInfo.updateTime, webInfo.totalSize); +} + +void ApplicationCacheHost::fillResourceList(ResourceInfoList* resources) +{ + if (!m_internal) + return; + + WebKit::WebVector<WebKit::WebApplicationCacheHost::ResourceInfo> webResources; + m_internal->m_outerHost->getResourceList(&webResources); + for (size_t i = 0; i < webResources.size(); ++i) { + resources->append(ResourceInfo( + webResources[i].url, webResources[i].isMaster, webResources[i].isManifest, webResources[i].isFallback, + webResources[i].isForeign, webResources[i].isExplicit, webResources[i].size)); } } +#endif void ApplicationCacheHost::stopDeferringEvents() { RefPtr<DocumentLoader> protect(documentLoader()); for (unsigned i = 0; i < m_deferredEvents.size(); ++i) { - EventID id = m_deferredEvents[i]; - if (m_domApplicationCache) { - ExceptionCode ec = 0; - m_domApplicationCache->dispatchEvent(Event::create(DOMApplicationCache::toEventType(id), false, false), ec); - ASSERT(!ec); - } + const DeferredEvent& deferred = m_deferredEvents[i]; + dispatchDOMEvent(deferred.eventID, deferred.progressTotal, deferred.progressDone); } m_deferredEvents.clear(); m_defersEvents = false; } +void ApplicationCacheHost::stopLoadingInFrame(Frame* frame) +{ + // FIXME: Implement this method. +} + +void ApplicationCacheHost::dispatchDOMEvent(EventID id, int total, int done) +{ + if (m_domApplicationCache) { + const AtomicString& eventType = DOMApplicationCache::toEventType(id); + ExceptionCode ec = 0; + RefPtr<Event> event; + if (id == PROGRESS_EVENT) + event = ProgressEvent::create(eventType, true, done, total); + else + event = Event::create(eventType, false, false); + m_domApplicationCache->dispatchEvent(event, ec); + ASSERT(!ec); + } +} + ApplicationCacheHost::Status ApplicationCacheHost::status() const { return m_internal ? static_cast<Status>(m_internal->m_outerHost->status()) : UNCACHED; diff --git a/WebKit/chromium/src/ApplicationCacheHostInternal.h b/WebKit/chromium/src/ApplicationCacheHostInternal.h index 3e52c1b..c88420b 100644 --- a/WebKit/chromium/src/ApplicationCacheHostInternal.h +++ b/WebKit/chromium/src/ApplicationCacheHostInternal.h @@ -33,9 +33,13 @@ #if ENABLE(OFFLINE_WEB_APPLICATIONS) +#include "DocumentLoader.h" #include "WebApplicationCacheHostClient.h" +#include "WebFrameClient.h" +#include "WebFrameImpl.h" #include "WebKit.h" #include "WebKitClient.h" +#include "WebURL.h" namespace WebCore { @@ -44,12 +48,24 @@ public: ApplicationCacheHostInternal(ApplicationCacheHost* host) : m_innerHost(host) { - m_outerHost.set(WebKit::webKitClient()->createApplicationCacheHost(this)); + WebKit::WebFrameImpl* webFrame = WebKit::WebFrameImpl::fromFrame(host->m_documentLoader->frame()); + ASSERT(webFrame); + m_outerHost.set(webFrame->client()->createApplicationCacheHost(webFrame, this)); + } + + virtual void didChangeCacheAssociation() + { + // FIXME: Prod the inspector to update it's notion of what cache the page is using. } virtual void notifyEventListener(WebKit::WebApplicationCacheHost::EventID eventID) { - m_innerHost->notifyDOMApplicationCache(static_cast<ApplicationCacheHost::EventID>(eventID)); + m_innerHost->notifyDOMApplicationCache(static_cast<ApplicationCacheHost::EventID>(eventID), 0, 0); + } + + virtual void notifyProgressEventListener(const WebKit::WebURL&, int progressTotal, int progressDone) + { + m_innerHost->notifyDOMApplicationCache(ApplicationCacheHost::PROGRESS_EVENT, progressTotal, progressDone); } static WebKit::WebApplicationCacheHost* toWebApplicationCacheHost(ApplicationCacheHost* innerHost) diff --git a/WebKit/chromium/src/AssertMatchingEnums.cpp b/WebKit/chromium/src/AssertMatchingEnums.cpp index 1d2948f..ceeed8d 100644 --- a/WebKit/chromium/src/AssertMatchingEnums.cpp +++ b/WebKit/chromium/src/AssertMatchingEnums.cpp @@ -35,29 +35,59 @@ #include "AccessibilityObject.h" #include "ApplicationCacheHost.h" +#include "AsyncFileSystem.h" #include "EditorInsertAction.h" +#include "FileError.h" +#include "FileMetadata.h" +#include "FontDescription.h" +#include "FontSmoothingMode.h" +#include "GeolocationError.h" +#include "GeolocationPosition.h" #include "HTMLInputElement.h" +#include "IDBKey.h" #include "MediaPlayer.h" #include "NotificationPresenter.h" #include "PasteboardPrivate.h" #include "PlatformCursor.h" -#include "StringImpl.h" +#include "Settings.h" #include "TextAffinity.h" +#include "UserContentTypes.h" +#include "UserScriptTypes.h" +#include "UserStyleSheetTypes.h" +#include "VideoFrameChromium.h" #include "WebAccessibilityObject.h" #include "WebApplicationCacheHost.h" #include "WebClipboard.h" #include "WebCursorInfo.h" #include "WebEditingAction.h" +#include "WebFileError.h" +#include "WebFileInfo.h" +#include "WebFileSystem.h" +#include "WebFontDescription.h" +#include "WebGeolocationError.h" +#include "WebGeolocationPosition.h" +#include "WebIDBKey.h" #include "WebInputElement.h" #include "WebMediaPlayer.h" #include "WebNotificationPresenter.h" +#include "WebScrollbar.h" +#include "WebSettings.h" #include "WebTextAffinity.h" #include "WebTextCaseSensitivity.h" +#include "WebVideoFrame.h" +#include "WebView.h" #include <wtf/Assertions.h> +#include <wtf/text/StringImpl.h> #define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, webcore_name) \ COMPILE_ASSERT(int(WebKit::webkit_name) == int(WebCore::webcore_name), mismatching_enums) +// These constants are in WTF, bring them into WebCore so the ASSERT still works for them! +namespace WebCore { + using WTF::TextCaseSensitive; + using WTF::TextCaseInsensitive; +}; + COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleUnknown, UnknownRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleButton, ButtonRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleRadioButton, RadioButtonRole); @@ -124,6 +154,7 @@ COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleDefinitionListDefinition, Defin COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleAnnotation, AnnotationRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleSliderThumb, SliderThumbRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleIgnored, IgnoredRole); +COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRolePresentational, PresentationalRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleTab, TabRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleTabList, TabListRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleTabPanel, TabPanelRole); @@ -177,6 +208,7 @@ COMPILE_ASSERT_MATCHING_ENUM(WebClipboard::FormatSmartPaste, PasteboardPrivate:: COMPILE_ASSERT_MATCHING_ENUM(WebClipboard::BufferStandard, PasteboardPrivate::StandardBuffer); COMPILE_ASSERT_MATCHING_ENUM(WebClipboard::BufferSelection, PasteboardPrivate::SelectionBuffer); +COMPILE_ASSERT_MATCHING_ENUM(WebClipboard::BufferDrag, PasteboardPrivate::DragBuffer); COMPILE_ASSERT_MATCHING_ENUM(WebCursorInfo::TypePointer, PlatformCursor::TypePointer); COMPILE_ASSERT_MATCHING_ENUM(WebCursorInfo::TypeCross, PlatformCursor::TypeCross); @@ -225,30 +257,30 @@ COMPILE_ASSERT_MATCHING_ENUM(WebEditingActionTyped, EditorInsertActionTyped); COMPILE_ASSERT_MATCHING_ENUM(WebEditingActionPasted, EditorInsertActionPasted); COMPILE_ASSERT_MATCHING_ENUM(WebEditingActionDropped, EditorInsertActionDropped); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Text, HTMLInputElement::TEXT); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Password, HTMLInputElement::PASSWORD); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::IsIndex, HTMLInputElement::ISINDEX); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::CheckBox, HTMLInputElement::CHECKBOX); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Radio, HTMLInputElement::RADIO); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Submit, HTMLInputElement::SUBMIT); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Reset, HTMLInputElement::RESET); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::File, HTMLInputElement::FILE); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Hidden, HTMLInputElement::HIDDEN); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Image, HTMLInputElement::IMAGE); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Button, HTMLInputElement::BUTTON); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Search, HTMLInputElement::SEARCH); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Range, HTMLInputElement::RANGE); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Email, HTMLInputElement::EMAIL); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Number, HTMLInputElement::NUMBER); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Telephone, HTMLInputElement::TELEPHONE); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::URL, HTMLInputElement::URL); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Color, HTMLInputElement::COLOR); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Date, HTMLInputElement::DATE); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::DateTime, HTMLInputElement::DATETIME); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::DateTimeLocal, HTMLInputElement::DATETIMELOCAL); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Month, HTMLInputElement::MONTH); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Time, HTMLInputElement::TIME); -COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Week, HTMLInputElement::WEEK); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyNone, FontDescription::NoFamily); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyStandard, FontDescription::StandardFamily); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilySerif, FontDescription::SerifFamily); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilySansSerif, FontDescription::SansSerifFamily); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyMonospace, FontDescription::MonospaceFamily); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyCursive, FontDescription::CursiveFamily); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyFantasy, FontDescription::FantasyFamily); + +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::SmoothingAuto, AutoSmoothing); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::SmoothingNone, NoSmoothing); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::SmoothingGrayscale, Antialiased); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::SmoothingSubpixel, SubpixelAntialiased); + +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight100, FontWeight100); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight200, FontWeight200); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight300, FontWeight300); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight400, FontWeight400); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight500, FontWeight500); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight600, FontWeight600); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight700, FontWeight700); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight800, FontWeight800); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight900, FontWeight900); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::WeightNormal, FontWeightNormal); +COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::WeightBold, FontWeightBold); COMPILE_ASSERT_MATCHING_ENUM(WebNode::ElementNode, Node::ELEMENT_NODE); COMPILE_ASSERT_MATCHING_ENUM(WebNode::AttributeNode, Node::ATTRIBUTE_NODE); @@ -283,6 +315,21 @@ COMPILE_ASSERT_MATCHING_ENUM(WebMediaPlayer::Unknown, MediaPlayer::Unknown); COMPILE_ASSERT_MATCHING_ENUM(WebMediaPlayer::Download, MediaPlayer::Download); COMPILE_ASSERT_MATCHING_ENUM(WebMediaPlayer::StoredStream, MediaPlayer::StoredStream); COMPILE_ASSERT_MATCHING_ENUM(WebMediaPlayer::LiveStream, MediaPlayer::LiveStream); + +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatInvalid, VideoFrameChromium::Invalid); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGB555, VideoFrameChromium::RGB555); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGB565, VideoFrameChromium::RGB565); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGB24, VideoFrameChromium::RGB24); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGB32, VideoFrameChromium::RGB32); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGBA, VideoFrameChromium::RGBA); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatYV12, VideoFrameChromium::YV12); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatYV16, VideoFrameChromium::YV16); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatNV12, VideoFrameChromium::NV12); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatEmpty, VideoFrameChromium::Empty); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatASCII, VideoFrameChromium::ASCII); + +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::SurfaceTypeSystemMemory, VideoFrameChromium::TypeSystemMemory); +COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::SurfaceTypeTexture, VideoFrameChromium::TypeTexture); #endif #if ENABLE(NOTIFICATIONS) @@ -291,8 +338,57 @@ COMPILE_ASSERT_MATCHING_ENUM(WebNotificationPresenter::PermissionNotAllowed, Not COMPILE_ASSERT_MATCHING_ENUM(WebNotificationPresenter::PermissionDenied, NotificationPresenter::PermissionDenied); #endif +COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::Horizontal, HorizontalScrollbar); +COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::Vertical, VerticalScrollbar); + +COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::ScrollByLine, ScrollByLine); +COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::ScrollByPage, ScrollByPage); +COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::ScrollByDocument, ScrollByDocument); +COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::ScrollByPixel, ScrollByPixel); + +COMPILE_ASSERT_MATCHING_ENUM(WebSettings::EditingBehaviorMac, EditingMacBehavior); +COMPILE_ASSERT_MATCHING_ENUM(WebSettings::EditingBehaviorWin, EditingWindowsBehavior); +COMPILE_ASSERT_MATCHING_ENUM(WebSettings::EditingBehaviorUnix, EditingUnixBehavior); + COMPILE_ASSERT_MATCHING_ENUM(WebTextAffinityUpstream, UPSTREAM); COMPILE_ASSERT_MATCHING_ENUM(WebTextAffinityDownstream, DOWNSTREAM); COMPILE_ASSERT_MATCHING_ENUM(WebTextCaseSensitive, TextCaseSensitive); COMPILE_ASSERT_MATCHING_ENUM(WebTextCaseInsensitive, TextCaseInsensitive); + +COMPILE_ASSERT_MATCHING_ENUM(WebView::UserScriptInjectAtDocumentStart, InjectAtDocumentStart); +COMPILE_ASSERT_MATCHING_ENUM(WebView::UserScriptInjectAtDocumentEnd, InjectAtDocumentEnd); +COMPILE_ASSERT_MATCHING_ENUM(WebView::UserContentInjectInAllFrames, InjectInAllFrames); +COMPILE_ASSERT_MATCHING_ENUM(WebView::UserContentInjectInTopFrameOnly, InjectInTopFrameOnly); +COMPILE_ASSERT_MATCHING_ENUM(WebView::UserStyleInjectInExistingDocuments, InjectInExistingDocuments); +COMPILE_ASSERT_MATCHING_ENUM(WebView::UserStyleInjectInSubsequentDocuments, InjectInSubsequentDocuments); + +COMPILE_ASSERT_MATCHING_ENUM(WebIDBKey::NullType, IDBKey::NullType); +COMPILE_ASSERT_MATCHING_ENUM(WebIDBKey::StringType, IDBKey::StringType); +COMPILE_ASSERT_MATCHING_ENUM(WebIDBKey::NumberType, IDBKey::NumberType); + +#if ENABLE(FILE_SYSTEM) +COMPILE_ASSERT_MATCHING_ENUM(WebFileSystem::TypeTemporary, AsyncFileSystem::Temporary); +COMPILE_ASSERT_MATCHING_ENUM(WebFileSystem::TypePersistent, AsyncFileSystem::Persistent); +COMPILE_ASSERT_MATCHING_ENUM(WebFileInfo::TypeUnknown, FileMetadata::TypeUnknown); +COMPILE_ASSERT_MATCHING_ENUM(WebFileInfo::TypeFile, FileMetadata::TypeFile); +COMPILE_ASSERT_MATCHING_ENUM(WebFileInfo::TypeDirectory, FileMetadata::TypeDirectory); +#endif + +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorNotFound, FileError::NOT_FOUND_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorSecurity, FileError::SECURITY_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorAbort, FileError::ABORT_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorNotReadable, FileError::NOT_READABLE_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorEncoding, FileError::ENCODING_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorNoModificationAllowed, FileError::NO_MODIFICATION_ALLOWED_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorInvalidState, FileError::INVALID_STATE_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorSyntax, FileError::SYNTAX_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorInvalidModification, FileError::INVALID_MODIFICATION_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorQuotaExceeded, FileError::QUOTA_EXCEEDED_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorTypeMismatch, FileError::TYPE_MISMATCH_ERR); +COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorPathExists, FileError::PATH_EXISTS_ERR); + +#if ENABLE(CLIENT_BASED_GEOLOCATION) +COMPILE_ASSERT_MATCHING_ENUM(WebGeolocationError::ErrorPermissionDenied, GeolocationError::PermissionDenied); +COMPILE_ASSERT_MATCHING_ENUM(WebGeolocationError::ErrorPositionUnavailable, GeolocationError::PositionUnavailable); +#endif diff --git a/WebKit/chromium/src/AssociatedURLLoader.cpp b/WebKit/chromium/src/AssociatedURLLoader.cpp new file mode 100644 index 0000000..f494a0e --- /dev/null +++ b/WebKit/chromium/src/AssociatedURLLoader.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "AssociatedURLLoader.h" + +#include "WebApplicationCacheHost.h" +#include "WebDataSource.h" +#include "WebFrameImpl.h" +#include "WebKit.h" +#include "WebKitClient.h" +#include "WebURLRequest.h" + +namespace WebKit { + +AssociatedURLLoader::AssociatedURLLoader(PassRefPtr<WebFrameImpl> frameImpl) + : m_frameImpl(frameImpl), + m_realLoader(webKitClient()->createURLLoader()) +{ +} + +AssociatedURLLoader::~AssociatedURLLoader() +{ +} + +void AssociatedURLLoader::loadSynchronously(const WebURLRequest& request, WebURLResponse& response, WebURLError& error, WebData& data) +{ + WebURLRequest requestCopy(request); + prepareRequest(requestCopy); + + m_realLoader->loadSynchronously(requestCopy, response, error, data); +} + +void AssociatedURLLoader::loadAsynchronously(const WebURLRequest& request, WebURLLoaderClient* client) +{ + WebURLRequest requestCopy(request); + prepareRequest(requestCopy); + + m_realLoader->loadAsynchronously(requestCopy, client); +} + +void AssociatedURLLoader::cancel() +{ + m_realLoader->cancel(); +} + +void AssociatedURLLoader::setDefersLoading(bool defersLoading) +{ + m_realLoader->setDefersLoading(defersLoading); +} + +void AssociatedURLLoader::prepareRequest(WebURLRequest& request) +{ + WebApplicationCacheHost* applicationCacheHost = m_frameImpl->dataSource()->applicationCacheHost(); + if (applicationCacheHost) + applicationCacheHost->willStartSubResourceRequest(request); + m_frameImpl->dispatchWillSendRequest(request); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/AssociatedURLLoader.h b/WebKit/chromium/src/AssociatedURLLoader.h new file mode 100644 index 0000000..4c9f54e --- /dev/null +++ b/WebKit/chromium/src/AssociatedURLLoader.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef AssociatedURLLoader_h +#define AssociatedURLLoader_h + +#include "WebURLLoader.h" +#include <wtf/OwnPtr.h> +#include <wtf/RefPtr.h> + +namespace WebKit { + +class WebFrameImpl; + +// This class is used to implement WebFrame::createAssociatedURLLoader. +// FIXME: Implement in terms of WebCore::SubresourceLoader. +class AssociatedURLLoader : public WebURLLoader { +public: + AssociatedURLLoader(PassRefPtr<WebFrameImpl>); + ~AssociatedURLLoader(); + + // WebURLLoader methods: + virtual void loadSynchronously(const WebURLRequest&, WebURLResponse&, WebURLError&, WebData&); + virtual void loadAsynchronously(const WebURLRequest&, WebURLLoaderClient*); + virtual void cancel(); + virtual void setDefersLoading(bool); + +private: + void prepareRequest(WebURLRequest&); + + RefPtr<WebFrameImpl> m_frameImpl; + OwnPtr<WebURLLoader> m_realLoader; +}; + +} // namespace WebKit + +#endif diff --git a/WebKit/chromium/src/AsyncFileSystemChromium.cpp b/WebKit/chromium/src/AsyncFileSystemChromium.cpp new file mode 100644 index 0000000..5975e72 --- /dev/null +++ b/WebKit/chromium/src/AsyncFileSystemChromium.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "AsyncFileSystemChromium.h" + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileSystemCallbacks.h" +#include "AsyncFileWriterChromium.h" +#include "WebFileInfo.h" +#include "WebFileSystem.h" +#include "WebFileSystemCallbacksImpl.h" +#include "WebFileWriter.h" +#include "WebKit.h" +#include "WebKitClient.h" + +#include <wtf/text/CString.h> + +namespace WebCore { + +bool AsyncFileSystem::isAvailable() +{ + return true; +} + +AsyncFileSystemChromium::AsyncFileSystemChromium(const String& rootPath) + : AsyncFileSystem(rootPath) + , m_webFileSystem(WebKit::webKitClient()->fileSystem()) +{ + ASSERT(m_webFileSystem); +} + +AsyncFileSystemChromium::~AsyncFileSystemChromium() +{ +} + +void AsyncFileSystemChromium::move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->move(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->copy(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->remove(path, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->removeRecursively(path, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->readMetadata(path, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->createFile(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->createDirectory(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->fileExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->directoryExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->readDirectory(path, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +class FileWriterHelperCallbacks : public WebKit::WebFileSystemCallbacks { +public: + FileWriterHelperCallbacks(AsyncFileWriterClient* client, const String& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks) + : m_client(client) + , m_path(path) + , m_webFileSystem(webFileSystem) + , m_callbacks(callbacks) + { + } + + virtual void didSucceed() + { + ASSERT_NOT_REACHED(); + delete this; + } + virtual void didReadMetadata(const WebKit::WebFileInfo& info) + { + ASSERT(m_callbacks); + if (info.type != WebKit::WebFileInfo::TypeFile || info.length < 0) + m_callbacks->didFail(WebKit::WebFileErrorInvalidState); + else { + OwnPtr<AsyncFileWriterChromium> asyncFileWriterChromium = adoptPtr(new AsyncFileWriterChromium(m_client)); + OwnPtr<WebKit::WebFileWriter> webFileWriter = adoptPtr(m_webFileSystem->createFileWriter(m_path, asyncFileWriterChromium.get())); + asyncFileWriterChromium->setWebFileWriter(webFileWriter.release()); + m_callbacks->didCreateFileWriter(asyncFileWriterChromium.release(), info.length); + } + delete this; + } + + virtual void didReadDirectory(const WebKit::WebVector<WebKit::WebFileSystemEntry>& entries, bool hasMore) + { + ASSERT_NOT_REACHED(); + delete this; + } + virtual void didOpenFileSystem(const WebKit::WebString& name, const WebKit::WebString& rootPath) + { + ASSERT_NOT_REACHED(); + delete this; + } + + virtual void didFail(WebKit::WebFileError error) + { + ASSERT(m_callbacks); + m_callbacks->didFail(error); + delete this; + } + +private: + AsyncFileWriterClient* m_client; + String m_path; + WebKit::WebFileSystem* m_webFileSystem; + OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks; +}; + +void AsyncFileSystemChromium::createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->readMetadata(path, new FileWriterHelperCallbacks(client, path, m_webFileSystem, callbacks)); +} + +} // namespace WebCore + +#endif diff --git a/WebKit/chromium/src/AsyncFileSystemChromium.h b/WebKit/chromium/src/AsyncFileSystemChromium.h new file mode 100644 index 0000000..6205609 --- /dev/null +++ b/WebKit/chromium/src/AsyncFileSystemChromium.h @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef AsyncFileSystemChromium_h +#define AsyncFileSystemChromium_h + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileSystem.h" +#include <wtf/PassOwnPtr.h> + +namespace WebKit { +class WebFileSystem; +} + +namespace WebCore { + +class AsyncFileSystemCallbacks; + +class AsyncFileSystemChromium : public AsyncFileSystem { +public: + static PassOwnPtr<AsyncFileSystem> create(const String& rootPath) + { + return adoptPtr(new AsyncFileSystemChromium(rootPath)); + } + + virtual ~AsyncFileSystemChromium(); + + virtual void move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + +private: + explicit AsyncFileSystemChromium(const String& rootPath); + WebKit::WebFileSystem* m_webFileSystem; +}; + +} // namespace WebCore + +#endif + +#endif // AsyncFileSystemChromium_h diff --git a/WebKit/chromium/src/AsyncFileWriterChromium.cpp b/WebKit/chromium/src/AsyncFileWriterChromium.cpp new file mode 100644 index 0000000..71cf3b5 --- /dev/null +++ b/WebKit/chromium/src/AsyncFileWriterChromium.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "AsyncFileWriterChromium.h" + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileWriterClient.h" +#include "Blob.h" +#include "WebFileWriter.h" +#include "WebURL.h" + +namespace WebCore { + +AsyncFileWriterChromium::AsyncFileWriterChromium(AsyncFileWriterClient* client) + : m_client(client) +{ +} + +AsyncFileWriterChromium::~AsyncFileWriterChromium() +{ +} + +void AsyncFileWriterChromium::setWebFileWriter(PassOwnPtr<WebKit::WebFileWriter> writer) +{ + m_writer = writer; +} + +void AsyncFileWriterChromium::write(long long position, Blob* data) +{ + ASSERT(m_writer); + m_writer->write(position, WebKit::WebURL(data->url())); +} + +void AsyncFileWriterChromium::truncate(long long length) +{ + ASSERT(m_writer); + m_writer->truncate(length); +} + +void AsyncFileWriterChromium::abort() +{ + ASSERT(m_writer); + m_writer->cancel(); +} + +void AsyncFileWriterChromium::didWrite(long long bytes, bool complete) +{ + ASSERT(m_writer); + m_client->didWrite(bytes, complete); +} + +void AsyncFileWriterChromium::didTruncate() +{ + m_client->didTruncate(); +} + +void AsyncFileWriterChromium::didFail(WebKit::WebFileError error) +{ + m_client->didFail(static_cast<FileError::ErrorCode>(error)); +} + +} // namespace + +#endif // ENABLE(FILE_SYSTEM) diff --git a/WebKit/chromium/src/AutocompletePopupMenuClient.h b/WebKit/chromium/src/AsyncFileWriterChromium.h index 16a3771..71a2f18 100644 --- a/WebKit/chromium/src/AutocompletePopupMenuClient.h +++ b/WebKit/chromium/src/AsyncFileWriterChromium.h @@ -28,38 +28,49 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef AutocompletePopupMenuClient_h -#define AutocompletePopupMenuClient_h - -#include "SuggestionsPopupMenuClient.h" +#ifndef AsyncFileWriterChromium_h +#define AsyncFileWriterChromium_h -namespace WebCore { -class HTMLInputElement; -} +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileWriter.h" +#include "WebFileError.h" +#include "WebFileWriterClient.h" +#include <wtf/PassOwnPtr.h> namespace WebKit { -class WebString; -template <typename T> class WebVector; +class WebFileWriter; +} -// The Autocomplete suggestions popup menu client, used to display a list of -// autocomplete suggestions. -class AutocompletePopupMenuClient : public SuggestionsPopupMenuClient { +namespace WebCore { + +class Blob; +class AsyncFileWriterClient; + +class AsyncFileWriterChromium : public AsyncFileWriter, public WebKit::WebFileWriterClient { public: - // SuggestionsPopupMenuClient implementation: - virtual unsigned getSuggestionsCount() const; - virtual WebString getSuggestion(unsigned listIndex) const; - virtual void removeSuggestionAtIndex(unsigned listIndex); + AsyncFileWriterChromium(AsyncFileWriterClient* client); + ~AsyncFileWriterChromium(); + + void setWebFileWriter(PassOwnPtr<WebKit::WebFileWriter> writer); - void initialize(WebCore::HTMLInputElement*, - const WebVector<WebString>& suggestions, - int defaultSuggestionIndex); + // FileWriter + virtual void write(long long position, Blob* data); + virtual void truncate(long long length); + virtual void abort(); - void setSuggestions(const WebVector<WebString>&); + // WebFileWriterClient + virtual void didWrite(long long bytes, bool complete); + virtual void didTruncate(); + virtual void didFail(WebKit::WebFileError); private: - Vector<WebCore::String> m_suggestions; + OwnPtr<WebKit::WebFileWriter> m_writer; + AsyncFileWriterClient* m_client; }; -} // namespace WebKit +} // namespace + +#endif // ENABLE(FILE_SYSTEM) -#endif +#endif // AsyncFileWriterChromium_h diff --git a/WebKit/chromium/src/AutoFillPopupMenuClient.cpp b/WebKit/chromium/src/AutoFillPopupMenuClient.cpp index 8e6cab4..32abd6f 100644 --- a/WebKit/chromium/src/AutoFillPopupMenuClient.cpp +++ b/WebKit/chromium/src/AutoFillPopupMenuClient.cpp @@ -31,65 +31,362 @@ #include "config.h" #include "AutoFillPopupMenuClient.h" +#include "CSSStyleSelector.h" +#include "CSSValueKeywords.h" +#include "Chrome.h" +#include "FrameView.h" #include "HTMLInputElement.h" +#include "RenderTheme.h" +#include "WebNode.h" #include "WebString.h" #include "WebVector.h" +#include "WebViewClient.h" +#include "WebViewImpl.h" using namespace WebCore; namespace WebKit { +AutoFillPopupMenuClient::AutoFillPopupMenuClient() + : m_separatorIndex(-1) + , m_selectedIndex(-1) + , m_textField(0) + , m_AutocompleteModeEnabled(false) +{ +} + +AutoFillPopupMenuClient::~AutoFillPopupMenuClient() +{ +} + unsigned AutoFillPopupMenuClient::getSuggestionsCount() const { - return m_names.size(); + return m_names.size() + ((m_separatorIndex == -1) ? 0 : 1); } WebString AutoFillPopupMenuClient::getSuggestion(unsigned listIndex) const { - // FIXME: Modify the PopupMenu to add the label in gray right-justified. - ASSERT(listIndex >= 0 && listIndex < m_names.size()); - return m_names[listIndex] + String(" (") + m_labels[listIndex] + String(")"); + int index = convertListIndexToInternalIndex(listIndex); + if (index == -1) + return WebString(); + + ASSERT(index >= 0 && static_cast<size_t>(index) < m_names.size()); + return m_names[index]; +} + +WebString AutoFillPopupMenuClient::getLabel(unsigned listIndex) const +{ + int index = convertListIndexToInternalIndex(listIndex); + if (index == -1) + return WebString(); + + ASSERT(index >= 0 && static_cast<size_t>(index) < m_labels.size()); + return m_labels[index]; +} + +WebString AutoFillPopupMenuClient::getIcon(unsigned listIndex) const +{ + int index = convertListIndexToInternalIndex(listIndex); + if (index == -1) + return WebString(); + + ASSERT(index >= 0 && static_cast<size_t>(index) < m_icons.size()); + return m_icons[index]; } void AutoFillPopupMenuClient::removeSuggestionAtIndex(unsigned listIndex) { - // FIXME: Do we want to remove AutoFill suggestions? - ASSERT(listIndex >= 0 && listIndex < m_names.size()); - m_names.remove(listIndex); - m_labels.remove(listIndex); + if (!canRemoveSuggestionAtIndex(listIndex)) + return; + + int index = convertListIndexToInternalIndex(listIndex); + + ASSERT(static_cast<unsigned>(index) < m_names.size()); + + m_names.remove(index); + m_labels.remove(index); + m_icons.remove(index); + m_uniqueIDs.remove(index); + + // Shift the separator index if necessary. + if (m_separatorIndex != -1) + m_separatorIndex--; +} + +bool AutoFillPopupMenuClient::canRemoveSuggestionAtIndex(unsigned listIndex) +{ + // Only allow deletion of items before the separator that have unique id 0 + // (i.e. are autocomplete rather than autofill items). + int index = convertListIndexToInternalIndex(listIndex); + return !m_uniqueIDs[index] && (m_separatorIndex == -1 || listIndex < static_cast<unsigned>(m_separatorIndex)); +} + +void AutoFillPopupMenuClient::valueChanged(unsigned listIndex, bool fireEvents) +{ + // DEPRECATED: Will be removed once AutoFill and Autocomplete merge is + // completed. + if (m_AutocompleteModeEnabled) { + m_textField->setValue(getSuggestion(listIndex)); + + WebViewImpl* webView = getWebView(); + if (!webView) + return; + + EditorClientImpl* editor = + static_cast<EditorClientImpl*>(webView->page()->editorClient()); + ASSERT(editor); + editor->onAutocompleteSuggestionAccepted( + static_cast<HTMLInputElement*>(m_textField.get())); + } else { + WebViewImpl* webView = getWebView(); + if (!webView) + return; + + if (m_separatorIndex != -1 && listIndex > static_cast<unsigned>(m_separatorIndex)) + --listIndex; + + ASSERT(listIndex < m_names.size()); + + webView->client()->didAcceptAutoFillSuggestion(WebNode(getTextField()), + m_names[listIndex], + m_labels[listIndex], + m_uniqueIDs[listIndex], + listIndex); + } +} + +void AutoFillPopupMenuClient::selectionChanged(unsigned listIndex, bool fireEvents) +{ + WebViewImpl* webView = getWebView(); + if (!webView) + return; + + if (m_separatorIndex != -1 && listIndex > static_cast<unsigned>(m_separatorIndex)) + --listIndex; + + ASSERT(listIndex < m_names.size()); + + webView->client()->didSelectAutoFillSuggestion(WebNode(getTextField()), + m_names[listIndex], + m_labels[listIndex], + m_uniqueIDs[listIndex]); +} + +void AutoFillPopupMenuClient::selectionCleared() +{ + WebViewImpl* webView = getWebView(); + if (webView) + webView->client()->didClearAutoFillSelection(WebNode(getTextField())); +} + +String AutoFillPopupMenuClient::itemText(unsigned listIndex) const +{ + return getSuggestion(listIndex); +} + +String AutoFillPopupMenuClient::itemLabel(unsigned listIndex) const +{ + return getLabel(listIndex); +} + +String AutoFillPopupMenuClient::itemIcon(unsigned listIndex) const +{ + return getIcon(listIndex); +} + +bool AutoFillPopupMenuClient::itemIsEnabled(unsigned listIndex) const +{ + return !itemIsWarning(listIndex); +} + +PopupMenuStyle AutoFillPopupMenuClient::itemStyle(unsigned listIndex) const +{ + return itemIsWarning(listIndex) ? *m_warningStyle : *m_regularStyle; +} + +PopupMenuStyle AutoFillPopupMenuClient::menuStyle() const +{ + return *m_regularStyle; +} + +int AutoFillPopupMenuClient::clientPaddingLeft() const +{ + // Bug http://crbug.com/7708 seems to indicate the style can be 0. + RenderStyle* style = textFieldStyle(); + if (!style) + return 0; + + return RenderTheme::defaultTheme()->popupInternalPaddingLeft(style); +} + +int AutoFillPopupMenuClient::clientPaddingRight() const +{ + // Bug http://crbug.com/7708 seems to indicate the style can be 0. + RenderStyle* style = textFieldStyle(); + if (!style) + return 0; + + return RenderTheme::defaultTheme()->popupInternalPaddingRight(style); +} + +void AutoFillPopupMenuClient::popupDidHide() +{ + WebViewImpl* webView = getWebView(); + if (!webView) + return; + + webView->autoFillPopupDidHide(); + webView->client()->didClearAutoFillSelection(WebNode(getTextField())); +} + +bool AutoFillPopupMenuClient::itemIsSeparator(unsigned listIndex) const +{ + return (m_separatorIndex != -1 && static_cast<unsigned>(m_separatorIndex) == listIndex); +} + +bool AutoFillPopupMenuClient::itemIsWarning(unsigned listIndex) const +{ + int index = convertListIndexToInternalIndex(listIndex); + if (index == -1) + return false; + + ASSERT(index >= 0 && static_cast<size_t>(index) < m_uniqueIDs.size()); + return m_uniqueIDs[index] < 0; +} + +void AutoFillPopupMenuClient::setTextFromItem(unsigned listIndex) +{ + m_textField->setValue(getSuggestion(listIndex)); +} + +FontSelector* AutoFillPopupMenuClient::fontSelector() const +{ + return m_textField->document()->styleSelector()->fontSelector(); +} + +HostWindow* AutoFillPopupMenuClient::hostWindow() const +{ + return m_textField->document()->view()->hostWindow(); +} + +PassRefPtr<Scrollbar> AutoFillPopupMenuClient::createScrollbar( + ScrollbarClient* client, + ScrollbarOrientation orientation, + ScrollbarControlSize size) +{ + return Scrollbar::createNativeScrollbar(client, orientation, size); } void AutoFillPopupMenuClient::initialize( HTMLInputElement* textField, const WebVector<WebString>& names, const WebVector<WebString>& labels, - int defaultSuggestionIndex) + const WebVector<WebString>& icons, + const WebVector<int>& uniqueIDs, + int separatorIndex) { ASSERT(names.size() == labels.size()); - ASSERT(defaultSuggestionIndex < static_cast<int>(names.size())); + ASSERT(names.size() == icons.size()); + ASSERT(names.size() == uniqueIDs.size()); + ASSERT(separatorIndex < static_cast<int>(names.size())); + + m_selectedIndex = -1; + m_textField = textField; // The suggestions must be set before initializing the - // SuggestionsPopupMenuClient. - setSuggestions(names, labels); + // AutoFillPopupMenuClient. + setSuggestions(names, labels, icons, uniqueIDs, separatorIndex); - SuggestionsPopupMenuClient::initialize(textField, defaultSuggestionIndex); + FontDescription regularFontDescription; + RenderTheme::defaultTheme()->systemFont(CSSValueWebkitControl, + regularFontDescription); + RenderStyle* style = m_textField->computedStyle(); + regularFontDescription.setComputedSize(style->fontDescription().computedSize()); + + Font regularFont(regularFontDescription, 0, 0); + regularFont.update(textField->document()->styleSelector()->fontSelector()); + // The direction of text in popup menu is set the same as the direction of + // the input element: textField. + m_regularStyle.set(new PopupMenuStyle(Color::black, Color::white, regularFont, + true, false, Length(WebCore::Fixed), + textField->renderer()->style()->direction())); + + FontDescription warningFontDescription = regularFont.fontDescription(); + warningFontDescription.setItalic(true); + Font warningFont(warningFontDescription, regularFont.letterSpacing(), regularFont.wordSpacing()); + warningFont.update(regularFont.fontSelector()); + m_warningStyle.set(new PopupMenuStyle(Color::darkGray, + m_regularStyle->backgroundColor(), + warningFont, + m_regularStyle->isVisible(), + m_regularStyle->isDisplayNone(), + m_regularStyle->textIndent(), + m_regularStyle->textDirection())); } void AutoFillPopupMenuClient::setSuggestions(const WebVector<WebString>& names, - const WebVector<WebString>& labels) + const WebVector<WebString>& labels, + const WebVector<WebString>& icons, + const WebVector<int>& uniqueIDs, + int separatorIndex) { ASSERT(names.size() == labels.size()); + ASSERT(names.size() == icons.size()); + ASSERT(names.size() == uniqueIDs.size()); + ASSERT(separatorIndex < static_cast<int>(names.size())); m_names.clear(); m_labels.clear(); + m_icons.clear(); + m_uniqueIDs.clear(); for (size_t i = 0; i < names.size(); ++i) { m_names.append(names[i]); m_labels.append(labels[i]); + m_icons.append(icons[i]); + m_uniqueIDs.append(uniqueIDs[i]); } + m_separatorIndex = separatorIndex; + // Try to preserve selection if possible. if (getSelectedIndex() >= static_cast<int>(names.size())) setSelectedIndex(-1); } +int AutoFillPopupMenuClient::convertListIndexToInternalIndex(unsigned listIndex) const +{ + if (listIndex == static_cast<unsigned>(m_separatorIndex)) + return -1; + + if (m_separatorIndex == -1 || listIndex < static_cast<unsigned>(m_separatorIndex)) + return listIndex; + return listIndex - 1; +} + +WebViewImpl* AutoFillPopupMenuClient::getWebView() const +{ + Frame* frame = m_textField->document()->frame(); + if (!frame) + return 0; + + Page* page = frame->page(); + if (!page) + return 0; + + return static_cast<ChromeClientImpl*>(page->chrome()->client())->webView(); +} + +RenderStyle* AutoFillPopupMenuClient::textFieldStyle() const +{ + RenderStyle* style = m_textField->computedStyle(); + if (!style) { + // It seems we can only have a 0 style in a TextField if the + // node is detached, in which case we the popup should not be + // showing. Please report this in http://crbug.com/7708 and + // include the page you were visiting. + ASSERT_NOT_REACHED(); + } + return style; +} + } // namespace WebKit diff --git a/WebKit/chromium/src/AutoFillPopupMenuClient.h b/WebKit/chromium/src/AutoFillPopupMenuClient.h index 1912fa3..e3edfd3 100644 --- a/WebKit/chromium/src/AutoFillPopupMenuClient.h +++ b/WebKit/chromium/src/AutoFillPopupMenuClient.h @@ -31,36 +31,126 @@ #ifndef AutoFillPopupMenuClient_h #define AutoFillPopupMenuClient_h -#include "SuggestionsPopupMenuClient.h" +#include "PopupMenuClient.h" namespace WebCore { class HTMLInputElement; +class PopupMenuStyle; +class RenderStyle; } namespace WebKit { class WebString; +class WebViewImpl; template <typename T> class WebVector; // The AutoFill suggestions popup menu client, used to display name suggestions // with right-justified labels. -class AutoFillPopupMenuClient : public SuggestionsPopupMenuClient { +class AutoFillPopupMenuClient : public WebCore::PopupMenuClient { public: - // SuggestionsPopupMenuClient implementation: + AutoFillPopupMenuClient(); + virtual ~AutoFillPopupMenuClient(); + + // Returns the number of suggestions available. virtual unsigned getSuggestionsCount() const; + + // Returns the suggestion at |listIndex|. virtual WebString getSuggestion(unsigned listIndex) const; + + // Returns the label at |listIndex|. + virtual WebString getLabel(unsigned listIndex) const; + + // Returns the icon at |listIndex|. + virtual WebString getIcon(unsigned listIndex) const; + + // Removes the suggestion at |listIndex| from the list of suggestions. virtual void removeSuggestionAtIndex(unsigned listIndex); + // Returns true if the suggestion at |listIndex| can be removed. + bool canRemoveSuggestionAtIndex(unsigned listIndex); + + // WebCore::PopupMenuClient methods: + virtual void valueChanged(unsigned listIndex, bool fireEvents = true); + virtual void selectionChanged(unsigned, bool); + virtual void selectionCleared(); + virtual WTF::String itemText(unsigned listIndex) const; + virtual WTF::String itemLabel(unsigned listIndex) const; + virtual WTF::String itemIcon(unsigned listIndex) const; + virtual WTF::String itemToolTip(unsigned lastIndex) const { return WTF::String(); } + virtual WTF::String itemAccessibilityText(unsigned lastIndex) const { return WTF::String(); } + virtual bool itemIsEnabled(unsigned listIndex) const; + virtual WebCore::PopupMenuStyle itemStyle(unsigned listIndex) const; + virtual WebCore::PopupMenuStyle menuStyle() const; + virtual int clientInsetLeft() const { return 0; } + virtual int clientInsetRight() const { return 0; } + virtual int clientPaddingLeft() const; + virtual int clientPaddingRight() const; + virtual int listSize() const { return getSuggestionsCount(); } + virtual int selectedIndex() const { return m_selectedIndex; } + virtual void popupDidHide(); + virtual bool itemIsSeparator(unsigned listIndex) const; + virtual bool itemIsLabel(unsigned listIndex) const { return false; } + virtual bool itemIsSelected(unsigned listIndex) const { return false; } + virtual bool shouldPopOver() const { return false; } + virtual bool valueShouldChangeOnHotTrack() const { return false; } + virtual void setTextFromItem(unsigned listIndex); + virtual WebCore::FontSelector* fontSelector() const; + virtual WebCore::HostWindow* hostWindow() const; + virtual PassRefPtr<WebCore::Scrollbar> createScrollbar( + WebCore::ScrollbarClient* client, + WebCore::ScrollbarOrientation orientation, + WebCore::ScrollbarControlSize size); + void initialize(WebCore::HTMLInputElement*, const WebVector<WebString>& names, const WebVector<WebString>& labels, - int defaultSuggestionIndex); + const WebVector<WebString>& icons, + const WebVector<int>& uniqueIDs, + int separatorIndex); void setSuggestions(const WebVector<WebString>& names, - const WebVector<WebString>& labels); + const WebVector<WebString>& labels, + const WebVector<WebString>& icons, + const WebVector<int>& uniqueIDs, + int separatorIndex); + + // DEPRECATED: Will be removed once Autocomplete and AutoFill merge is + // complete. + void setAutocompleteMode(bool enabled) { m_AutocompleteModeEnabled = enabled; } private: - Vector<WebCore::String> m_names; - Vector<WebCore::String> m_labels; + // Convert the specified index from an index into the visible list (which might + // include a separator entry) to an index to |m_names| and |m_labels|. + // Returns -1 if the given index points to the separator. + int convertListIndexToInternalIndex(unsigned) const; + WebViewImpl* getWebView() const; + WebCore::HTMLInputElement* getTextField() const { return m_textField.get(); } + WebCore::RenderStyle* textFieldStyle() const; + + int getSelectedIndex() const { return m_selectedIndex; } + void setSelectedIndex(int index) { m_selectedIndex = index; } + + bool itemIsWarning(unsigned listIndex) const; + + // The names, labels and icons that make up the contents of the menu items. + Vector<WTF::String> m_names; + Vector<WTF::String> m_labels; + Vector<WTF::String> m_icons; + Vector<int> m_uniqueIDs; + + // The index of the separator. -1 if there is no separator. + int m_separatorIndex; + + // The index of the selected item. -1 if there is no selected item. + int m_selectedIndex; + + RefPtr<WebCore::HTMLInputElement> m_textField; + OwnPtr<WebCore::PopupMenuStyle> m_regularStyle; + OwnPtr<WebCore::PopupMenuStyle> m_warningStyle; + + // DEPRECATED: Will be removed once Autocomplete and AutoFill merge is + // complete. + bool m_AutocompleteModeEnabled; }; } // namespace WebKit diff --git a/WebKit/chromium/src/BackForwardListClientImpl.cpp b/WebKit/chromium/src/BackForwardListClientImpl.cpp index f5b04ab..af659bc 100644 --- a/WebKit/chromium/src/BackForwardListClientImpl.cpp +++ b/WebKit/chromium/src/BackForwardListClientImpl.cpp @@ -34,6 +34,7 @@ #include "HistoryItem.h" #include "WebViewClient.h" #include "WebViewImpl.h" +#include <wtf/text/StringConcatenate.h> using namespace WebCore; @@ -83,14 +84,15 @@ void BackForwardListClientImpl::goToItem(HistoryItem* item) m_pendingHistoryItem = 0; } -HistoryItem* BackForwardListClientImpl::currentItem() -{ - return m_currentItem.get(); -} - HistoryItem* BackForwardListClientImpl::itemAtIndex(int index) { - if (!m_webView->client() || index > forwardListCount() || -index > backListCount()) + if (!m_webView->client()) + return 0; + + if (!index) + return m_currentItem.get(); + + if (index > forwardListCount() || -index > backListCount()) return 0; // Since we don't keep the entire back/forward list, we have no way to @@ -102,11 +104,8 @@ HistoryItem* BackForwardListClientImpl::itemAtIndex(int index) // differently. It should perhaps just ask the FrameLoaderClient to // perform those navigations. - String url_string = String::format( - "%s://go/%d", backForwardNavigationScheme, index); - - m_pendingHistoryItem = - HistoryItem::create(url_string, String(), 0.0); + String urlString = makeString(backForwardNavigationScheme, "://go/", String::number(index)); + m_pendingHistoryItem = HistoryItem::create(urlString, String(), 0); return m_pendingHistoryItem.get(); } diff --git a/WebKit/chromium/src/BackForwardListClientImpl.h b/WebKit/chromium/src/BackForwardListClientImpl.h index 1d8beb0..b795ecf 100644 --- a/WebKit/chromium/src/BackForwardListClientImpl.h +++ b/WebKit/chromium/src/BackForwardListClientImpl.h @@ -31,7 +31,7 @@ #ifndef BackForwardListClientImpl_h #define BackForwardListClientImpl_h -#include "BackForwardList.h" +#include "BackForwardListImpl.h" namespace WebKit { class WebViewImpl; @@ -50,7 +50,6 @@ private: // WebCore::BackForwardListClient methods: virtual void addItem(PassRefPtr<WebCore::HistoryItem>); virtual void goToItem(WebCore::HistoryItem*); - virtual WebCore::HistoryItem* currentItem(); virtual WebCore::HistoryItem* itemAtIndex(int index); virtual int backListCount(); virtual int forwardListCount(); diff --git a/WebKit/chromium/src/BlobRegistryProxy.cpp b/WebKit/chromium/src/BlobRegistryProxy.cpp new file mode 100644 index 0000000..84fcb4d --- /dev/null +++ b/WebKit/chromium/src/BlobRegistryProxy.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" + +#if ENABLE(BLOB) + +#include "BlobRegistryProxy.h" + +#include "BlobData.h" +#include "KURL.h" +#include "ResourceHandle.h" +#include "WebBlobData.h" +#include "WebBlobRegistry.h" +#include "WebKit.h" +#include "WebKitClient.h" +#include "WebURL.h" +#include <wtf/MainThread.h> +#include <wtf/StdLibExtras.h> + +// We are part of the WebKit implementation. +using namespace WebKit; + +namespace WebCore { + +BlobRegistry& blobRegistry() +{ + ASSERT(isMainThread()); + DEFINE_STATIC_LOCAL(BlobRegistryProxy, instance, ()); + return instance; +} + +BlobRegistryProxy::BlobRegistryProxy() + : m_webBlobRegistry(WebKit::webKitClient()->blobRegistry()) +{ +} + +void BlobRegistryProxy::registerBlobURL(const KURL& url, PassOwnPtr<BlobData> blobData) +{ + if (m_webBlobRegistry) { + WebBlobData webBlobData(blobData); + m_webBlobRegistry->registerBlobURL(url, webBlobData); + } +} + +void BlobRegistryProxy::registerBlobURL(const KURL& url, const KURL& srcURL) +{ + if (m_webBlobRegistry) + m_webBlobRegistry->registerBlobURL(url, srcURL); +} + +void BlobRegistryProxy::unregisterBlobURL(const KURL& url) +{ + if (m_webBlobRegistry) + m_webBlobRegistry->unregisterBlobURL(url); +} + +} // namespace WebCore + +#endif diff --git a/WebKit/chromium/src/BlobRegistryProxy.h b/WebKit/chromium/src/BlobRegistryProxy.h new file mode 100644 index 0000000..6f2ebb2 --- /dev/null +++ b/WebKit/chromium/src/BlobRegistryProxy.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef BlobRegistryProxy_h +#define BlobRegistryProxy_h + +#if ENABLE(BLOB) + +#include "BlobRegistry.h" + +namespace WebKit { class WebBlobRegistry; } + +namespace WebCore { + +class BlobRegistryProxy : public BlobRegistry { +public: + BlobRegistryProxy(); + + virtual void registerBlobURL(const KURL&, PassOwnPtr<BlobData>); + virtual void registerBlobURL(const KURL&, const KURL& srcURL); + virtual void unregisterBlobURL(const KURL&); + + virtual PassRefPtr<ResourceHandle> createResourceHandle(const ResourceRequest&, ResourceHandleClient*) { return 0; } + virtual bool loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data) { return false; } + +private: + virtual ~BlobRegistryProxy() { } + + WebKit::WebBlobRegistry* m_webBlobRegistry; +}; + +} // namespace WebCore + +#endif // ENABLE(BLOB) + +#endif // BlobRegistryProxy_h diff --git a/WebKit/chromium/src/ChromeClientImpl.cpp b/WebKit/chromium/src/ChromeClientImpl.cpp index ce2f00c..7b67ede 100644 --- a/WebKit/chromium/src/ChromeClientImpl.cpp +++ b/WebKit/chromium/src/ChromeClientImpl.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -31,25 +32,36 @@ #include "config.h" #include "ChromeClientImpl.h" -#include "AccessibilityObject.h" #include "AXObjectCache.h" +#include "AccessibilityObject.h" #include "CharacterNames.h" #include "Console.h" #include "Cursor.h" #include "DatabaseTracker.h" #include "Document.h" #include "DocumentLoader.h" +#include "ExternalPopupMenu.h" #include "FileChooser.h" #include "FloatRect.h" #include "FrameLoadRequest.h" #include "FrameView.h" +#include "Geolocation.h" +#include "GeolocationService.h" +#include "GeolocationServiceChromium.h" +#include "GraphicsLayer.h" +#include "HTMLNames.h" #include "HitTestResult.h" #include "IntRect.h" +#include "NavigationAction.h" #include "Node.h" #include "NotificationPresenterImpl.h" #include "Page.h" #include "PopupMenuChromium.h" +#include "RenderWidget.h" #include "ScriptController.h" +#include "SearchPopupMenuChromium.h" +#include "SecurityOrigin.h" +#include "Settings.h" #if USE(V8) #include "V8Proxy.h" #endif @@ -59,15 +71,21 @@ #include "WebFileChooserCompletionImpl.h" #include "WebFrameClient.h" #include "WebFrameImpl.h" +#include "WebGeolocationService.h" #include "WebInputEvent.h" #include "WebKit.h" +#include "WebNode.h" +#include "WebPlugin.h" +#include "WebPluginContainerImpl.h" #include "WebPopupMenuImpl.h" #include "WebPopupMenuInfo.h" +#include "WebPopupType.h" #include "WebRect.h" #include "WebTextDirection.h" #include "WebURLRequest.h" #include "WebViewClient.h" #include "WebViewImpl.h" +#include "WebWindowFeatures.h" #include "WindowFeatures.h" #include "WrappedResourceRequest.h" @@ -75,6 +93,60 @@ using namespace WebCore; namespace WebKit { +// Converts a WebCore::PopupContainerType to a WebKit::WebPopupType. +static WebPopupType convertPopupType(PopupContainer::PopupType type) +{ + switch (type) { + case PopupContainer::Select: + return WebPopupTypeSelect; + case PopupContainer::Suggestion: + return WebPopupTypeSuggestion; + default: + ASSERT_NOT_REACHED(); + return WebPopupTypeNone; + } +} + +// Converts a WebCore::AXObjectCache::AXNotification to a WebKit::WebAccessibilityNotification +static WebAccessibilityNotification toWebAccessibilityNotification(AXObjectCache::AXNotification notification) +{ + switch (notification) { + case AXObjectCache::AXActiveDescendantChanged: + return WebAccessibilityNotificationActiveDescendantChanged; + case AXObjectCache::AXCheckedStateChanged: + return WebAccessibilityNotificationCheckedStateChanged; + case AXObjectCache::AXChildrenChanged: + return WebAccessibilityNotificationChildrenChanged; + case AXObjectCache::AXFocusedUIElementChanged: + return WebAccessibilityNotificationFocusedUIElementChanged; + case AXObjectCache::AXLayoutComplete: + return WebAccessibilityNotificationLayoutComplete; + case AXObjectCache::AXLoadComplete: + return WebAccessibilityNotificationLoadComplete; + case AXObjectCache::AXSelectedChildrenChanged: + return WebAccessibilityNotificationSelectedChildrenChanged; + case AXObjectCache::AXSelectedTextChanged: + return WebAccessibilityNotificationSelectedTextChanged; + case AXObjectCache::AXValueChanged: + return WebAccessibilityNotificationValueChanged; + case AXObjectCache::AXScrolledToAnchor: + return WebAccessibilityNotificationScrolledToAnchor; + case AXObjectCache::AXLiveRegionChanged: + return WebAccessibilityNotificationLiveRegionChanged; + case AXObjectCache::AXMenuListValueChanged: + return WebAccessibilityNotificationMenuListValueChanged; + case AXObjectCache::AXRowCountChanged: + return WebAccessibilityNotificationRowCountChanged; + case AXObjectCache::AXRowCollapsed: + return WebAccessibilityNotificationRowCollapsed; + case AXObjectCache::AXRowExpanded: + return WebAccessibilityNotificationRowExpanded; + default: + ASSERT_NOT_REACHED(); + return WebAccessibilityNotificationInvalid; + } +} + ChromeClientImpl::ChromeClientImpl(WebViewImpl* webView) : m_webView(webView) , m_toolbarsVisible(true) @@ -82,7 +154,6 @@ ChromeClientImpl::ChromeClientImpl(WebViewImpl* webView) , m_scrollbarsVisible(true) , m_menubarVisible(true) , m_resizable(true) - , m_ignoreNextSetCursor(false) { } @@ -138,35 +209,8 @@ float ChromeClientImpl::scaleFactor() void ChromeClientImpl::focus() { - if (!m_webView->client()) - return; - - m_webView->client()->didFocus(); - - // If accessibility is enabled, we should notify assistive technology that - // the active AccessibilityObject changed. - const Frame* frame = m_webView->focusedWebCoreFrame(); - if (!frame) - return; - - Document* doc = frame->document(); - - if (doc && doc->axObjectCache()->accessibilityEnabled()) { - Node* focusedNode = m_webView->focusedWebCoreNode(); - - if (!focusedNode) { - // Could not retrieve focused Node. - return; - } - - // Retrieve the focused AccessibilityObject. - AccessibilityObject* focusedAccObj = - doc->axObjectCache()->getOrCreate(focusedNode->renderer()); - - // Alert assistive technology that focus changed. - if (focusedAccObj) - m_webView->client()->focusAccessibilityObject(WebAccessibilityObject(focusedAccObj)); - } + if (m_webView->client()) + m_webView->client()->didFocus(); } void ChromeClientImpl::unfocus() @@ -194,27 +238,33 @@ void ChromeClientImpl::takeFocus(FocusDirection direction) void ChromeClientImpl::focusedNodeChanged(Node* node) { - WebURL focus_url; + m_webView->client()->focusedNodeChanged(WebNode(node)); + + WebURL focusURL; if (node && node->isLink()) { // This HitTestResult hack is the easiest way to get a link URL out of a // WebCore::Node. - HitTestResult hit_test(IntPoint(0, 0)); + HitTestResult hitTest(IntPoint(0, 0)); // This cast must be valid because of the isLink() check. - hit_test.setURLElement(reinterpret_cast<Element*>(node)); - if (hit_test.isLiveLink()) - focus_url = hit_test.absoluteLinkURL(); + hitTest.setURLElement(static_cast<Element*>(node)); + if (hitTest.isLiveLink()) + focusURL = hitTest.absoluteLinkURL(); } - m_webView->client()->setKeyboardFocusURL(focus_url); + m_webView->client()->setKeyboardFocusURL(focusURL); +} + +void ChromeClientImpl::focusedFrameChanged(Frame*) +{ } Page* ChromeClientImpl::createWindow( - Frame* frame, const FrameLoadRequest& r, const WindowFeatures& features) + Frame* frame, const FrameLoadRequest& r, const WindowFeatures& features, const NavigationAction&) { if (!m_webView->client()) return 0; WebViewImpl* newView = static_cast<WebViewImpl*>( - m_webView->client()->createView(WebFrameImpl::fromFrame(frame))); + m_webView->client()->createView(WebFrameImpl::fromFrame(frame), features, r.frameName())); if (!newView) return 0; @@ -321,9 +371,9 @@ bool ChromeClientImpl::statusbarVisible() void ChromeClientImpl::setScrollbarsVisible(bool value) { m_scrollbarsVisible = value; - WebFrameImpl* web_frame = static_cast<WebFrameImpl*>(m_webView->mainFrame()); - if (web_frame) - web_frame->setAllowsScrolling(value); + WebFrameImpl* webFrame = static_cast<WebFrameImpl*>(m_webView->mainFrame()); + if (webFrame) + webFrame->setCanHaveScrollbars(value); } bool ChromeClientImpl::scrollbarsVisible() @@ -462,26 +512,49 @@ IntRect ChromeClientImpl::windowResizerRect() const return result; } -void ChromeClientImpl::repaint( - const IntRect& paintRect, bool contentChanged, bool immediate, - bool repaintContentOnly) +void ChromeClientImpl::invalidateWindow(const IntRect&, bool) { - // Ignore spurious calls. - if (!contentChanged || paintRect.isEmpty()) + notImplemented(); +} + +void ChromeClientImpl::invalidateContentsAndWindow(const IntRect& updateRect, bool /*immediate*/) +{ + if (updateRect.isEmpty()) return; - if (m_webView->client()) - m_webView->client()->didInvalidateRect(paintRect); +#if USE(ACCELERATED_COMPOSITING) + if (!m_webView->isAcceleratedCompositingActive()) { +#endif + if (m_webView->client()) + m_webView->client()->didInvalidateRect(updateRect); +#if USE(ACCELERATED_COMPOSITING) + } else + m_webView->invalidateRootLayerRect(updateRect); +#endif +} + +void ChromeClientImpl::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate) +{ + m_webView->hidePopups(); + invalidateContentsAndWindow(updateRect, immediate); } void ChromeClientImpl::scroll( const IntSize& scrollDelta, const IntRect& scrollRect, const IntRect& clipRect) { - if (m_webView->client()) { - int dx = scrollDelta.width(); - int dy = scrollDelta.height(); - m_webView->client()->didScrollRect(dx, dy, clipRect); - } + m_webView->hidePopups(); +#if USE(ACCELERATED_COMPOSITING) + if (!m_webView->isAcceleratedCompositingActive()) { +#endif + if (m_webView->client()) { + int dx = scrollDelta.width(); + int dy = scrollDelta.height(); + m_webView->client()->didScrollRect(dx, dy, clipRect); + } +#if USE(ACCELERATED_COMPOSITING) + } else + m_webView->scrollRootLayerRect(scrollDelta, clipRect); +#endif } IntPoint ChromeClientImpl::screenToWindow(const IntPoint&) const @@ -518,11 +591,25 @@ void ChromeClientImpl::mouseDidMoveOverElement( { if (!m_webView->client()) return; + + WebURL url; // Find out if the mouse is over a link, and if so, let our UI know... if (result.isLiveLink() && !result.absoluteLinkURL().string().isEmpty()) - m_webView->client()->setMouseOverURL(result.absoluteLinkURL()); - else - m_webView->client()->setMouseOverURL(WebURL()); + url = result.absoluteLinkURL(); + else if (result.innerNonSharedNode() + && (result.innerNonSharedNode()->hasTagName(HTMLNames::objectTag) + || result.innerNonSharedNode()->hasTagName(HTMLNames::embedTag))) { + RenderObject* object = result.innerNonSharedNode()->renderer(); + if (object && object->isWidget()) { + Widget* widget = toRenderWidget(object)->widget(); + if (widget && widget->isPluginContainer()) { + WebPluginContainerImpl* plugin = static_cast<WebPluginContainerImpl*>(widget); + url = plugin->plugin()->linkAtPosition(result.point()); + } + } + } + + m_webView->client()->setMouseOverURL(url); } void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir) @@ -552,6 +639,11 @@ void ChromeClientImpl::reachedMaxAppCacheSize(int64_t spaceNeeded) { ASSERT_NOT_REACHED(); } + +void ChromeClientImpl::reachedApplicationCacheOriginQuota(SecurityOrigin*) +{ + ASSERT_NOT_REACHED(); +} #endif void ChromeClientImpl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileChooser) @@ -562,6 +654,11 @@ void ChromeClientImpl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileCh WebFileChooserParams params; params.multiSelect = fileChooser->allowsMultipleFiles(); +#if ENABLE(DIRECTORY_UPLOAD) + params.directory = fileChooser->allowsDirectoryUpload(); +#else + params.directory = false; +#endif params.acceptTypes = fileChooser->acceptTypes(); params.selectedFiles = fileChooser->filenames(); if (params.selectedFiles.size() > 0) @@ -576,9 +673,13 @@ void ChromeClientImpl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileCh chooserCompletion->didChooseFile(WebVector<WebString>()); } +void ChromeClientImpl::chooseIconForFiles(const Vector<WTF::String>&, WebCore::FileChooser*) +{ + notImplemented(); +} + void ChromeClientImpl::popupOpened(PopupContainer* popupContainer, const IntRect& bounds, - bool activatable, bool handleExternally) { if (!m_webView->client()) @@ -589,19 +690,24 @@ void ChromeClientImpl::popupOpened(PopupContainer* popupContainer, WebPopupMenuInfo popupInfo; getPopupMenuInfo(popupContainer, &popupInfo); webwidget = m_webView->client()->createPopupMenu(popupInfo); - } else - webwidget = m_webView->client()->createPopupMenu(activatable); - + } else { + webwidget = m_webView->client()->createPopupMenu( + convertPopupType(popupContainer->popupType())); + // We only notify when the WebView has to handle the popup, as when + // the popup is handled externally, the fact that a popup is showing is + // transparent to the WebView. + m_webView->popupOpened(popupContainer); + } static_cast<WebPopupMenuImpl*>(webwidget)->Init(popupContainer, bounds); } -void ChromeClientImpl::setCursor(const WebCursorInfo& cursor) +void ChromeClientImpl::popupClosed(WebCore::PopupContainer* popupContainer) { - if (m_ignoreNextSetCursor) { - m_ignoreNextSetCursor = false; - return; - } + m_webView->popupClosed(popupContainer); +} +void ChromeClientImpl::setCursor(const WebCursorInfo& cursor) +{ if (m_webView->client()) m_webView->client()->didChangeCursor(cursor); } @@ -609,11 +715,6 @@ void ChromeClientImpl::setCursor(const WebCursorInfo& cursor) void ChromeClientImpl::setCursorForPlugin(const WebCursorInfo& cursor) { setCursor(cursor); - - // Currently, Widget::setCursor is always called after this function in - // EventHandler.cpp and since we don't want that we set a flag indicating - // that the next SetCursor call is to be ignored. - m_ignoreNextSetCursor = true; } void ChromeClientImpl::formStateDidChange(const Node* node) @@ -655,18 +756,19 @@ void ChromeClientImpl::getPopupMenuInfo(PopupContainer* popupContainer, } info->itemHeight = popupContainer->menuItemHeight(); + info->itemFontSize = popupContainer->menuItemFontSize(); info->selectedIndex = popupContainer->selectedIndex(); info->items.swap(outputItems); + info->rightAligned = popupContainer->menuStyle().textDirection() == RTL; } -void ChromeClientImpl::didChangeAccessibilityObjectState(AccessibilityObject* obj) +void ChromeClientImpl::postAccessibilityNotification(AccessibilityObject* obj, AXObjectCache::AXNotification notification) { - // Alert assistive technology about the accessibility object state change + // Alert assistive technology about the accessibility object notification. if (obj) - m_webView->client()->didChangeAccessibilityObjectState(WebAccessibilityObject(obj)); + m_webView->client()->postAccessibilityNotification(WebAccessibilityObject(obj), toWebAccessibilityNotification(notification)); } - #if ENABLE(NOTIFICATIONS) NotificationPresenter* ChromeClientImpl::notificationPresenter() const { @@ -674,4 +776,95 @@ NotificationPresenter* ChromeClientImpl::notificationPresenter() const } #endif +void ChromeClientImpl::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation) +{ +#if ENABLE(CLIENT_BASED_GEOLOCATION) + // FIXME: Implement Client-based Geolocation Permissions +#else + GeolocationServiceChromium* geolocationService = static_cast<GeolocationServiceChromium*>(geolocation->getGeolocationService()); + geolocationService->geolocationServiceBridge()->attachBridgeIfNeeded(); + m_webView->client()->geolocationService()->requestPermissionForFrame(geolocationService->geolocationServiceBridge()->getBridgeId(), frame->document()->url()); +#endif +} + +void ChromeClientImpl::cancelGeolocationPermissionRequestForFrame(Frame* frame, Geolocation* geolocation) +{ +#if ENABLE(CLIENT_BASED_GEOLOCATION) + // FIXME: Implement Client-based Geolocation Permissions +#else + GeolocationServiceChromium* geolocationService = static_cast<GeolocationServiceChromium*>(geolocation->getGeolocationService()); + m_webView->client()->geolocationService()->cancelPermissionRequestForFrame(geolocationService->geolocationServiceBridge()->getBridgeId(), frame->document()->url()); +#endif +} + +#if USE(ACCELERATED_COMPOSITING) +void ChromeClientImpl::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer) +{ + m_webView->setRootGraphicsLayer(graphicsLayer ? graphicsLayer->platformLayer() : 0); +} + +void ChromeClientImpl::scheduleCompositingLayerSync() +{ + m_webView->setRootLayerNeedsDisplay(); +} + +ChromeClient::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const +{ + if (!m_webView->allowsAcceleratedCompositing()) + return 0; + + CompositingTriggerFlags flags = 0; + Settings* settings = m_webView->page()->settings(); + if (settings->acceleratedCompositingFor3DTransformsEnabled()) + flags |= ThreeDTransformTrigger; + if (settings->acceleratedCompositingForVideoEnabled()) + flags |= VideoTrigger; + if (settings->acceleratedCompositingForPluginsEnabled()) + flags |= PluginTrigger; + if (settings->acceleratedCompositingForAnimationEnabled()) + flags |= AnimationTrigger; + if (settings->acceleratedCompositingForCanvasEnabled()) + flags |= CanvasTrigger; + + return flags; +} +#endif + +bool ChromeClientImpl::supportsFullscreenForNode(const WebCore::Node* node) +{ + if (m_webView->client() && node->hasTagName(WebCore::HTMLNames::videoTag)) + return m_webView->client()->supportsFullscreen(); + return false; +} + +void ChromeClientImpl::enterFullscreenForNode(WebCore::Node* node) +{ + if (m_webView->client()) + m_webView->client()->enterFullscreenForNode(WebNode(node)); +} + +void ChromeClientImpl::exitFullscreenForNode(WebCore::Node* node) +{ + if (m_webView->client()) + m_webView->client()->exitFullscreenForNode(WebNode(node)); +} + +bool ChromeClientImpl::selectItemWritingDirectionIsNatural() +{ + return false; +} + +PassRefPtr<PopupMenu> ChromeClientImpl::createPopupMenu(PopupMenuClient* client) const +{ + if (WebViewImpl::useExternalPopupMenus()) + return adoptRef(new ExternalPopupMenu(client, m_webView->client())); + + return adoptRef(new PopupMenuChromium(client)); +} + +PassRefPtr<SearchPopupMenu> ChromeClientImpl::createSearchPopupMenu(PopupMenuClient* client) const +{ + return adoptRef(new SearchPopupMenuChromium(client)); +} + } // namespace WebKit diff --git a/WebKit/chromium/src/ChromeClientImpl.h b/WebKit/chromium/src/ChromeClientImpl.h index 9e8c2e3..b024bc0 100644 --- a/WebKit/chromium/src/ChromeClientImpl.h +++ b/WebKit/chromium/src/ChromeClientImpl.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -32,11 +33,15 @@ #define ChromeClientImpl_h #include "ChromeClientChromium.h" +#include "PopupMenu.h" +#include "SearchPopupMenu.h" namespace WebCore { class AccessibilityObject; +class FileChooser; class HTMLParserQuirks; class PopupContainer; +class PopupMenuClient; class SecurityOrigin; struct WindowFeatures; } @@ -65,8 +70,9 @@ public: virtual bool canTakeFocus(WebCore::FocusDirection); virtual void takeFocus(WebCore::FocusDirection); virtual void focusedNodeChanged(WebCore::Node*); + virtual void focusedFrameChanged(WebCore::Frame*); virtual WebCore::Page* createWindow( - WebCore::Frame*, const WebCore::FrameLoadRequest&, const WebCore::WindowFeatures&); + WebCore::Frame*, const WebCore::FrameLoadRequest&, const WebCore::WindowFeatures&, const WebCore::NavigationAction&); virtual void show(); virtual bool canRunModal(); virtual void runModal(); @@ -81,24 +87,24 @@ public: virtual void setResizable(bool); virtual void addMessageToConsole( WebCore::MessageSource, WebCore::MessageType, WebCore::MessageLevel, - const WebCore::String& message, unsigned lineNumber, - const WebCore::String& sourceID); + const WTF::String& message, unsigned lineNumber, + const WTF::String& sourceID); virtual bool canRunBeforeUnloadConfirmPanel(); virtual bool runBeforeUnloadConfirmPanel( - const WebCore::String& message, WebCore::Frame*); + const WTF::String& message, WebCore::Frame*); virtual void closeWindowSoon(); - virtual void runJavaScriptAlert(WebCore::Frame*, const WebCore::String&); - virtual bool runJavaScriptConfirm(WebCore::Frame*, const WebCore::String&); + virtual void runJavaScriptAlert(WebCore::Frame*, const WTF::String&); + virtual bool runJavaScriptConfirm(WebCore::Frame*, const WTF::String&); virtual bool runJavaScriptPrompt( - WebCore::Frame*, const WebCore::String& message, - const WebCore::String& defaultValue, WebCore::String& result); - virtual void setStatusbarText(const WebCore::String& message); + WebCore::Frame*, const WTF::String& message, + const WTF::String& defaultValue, WTF::String& result); + virtual void setStatusbarText(const WTF::String& message); virtual bool shouldInterruptJavaScript(); virtual bool tabsToLinks() const; virtual WebCore::IntRect windowResizerRect() const; - virtual void repaint( - const WebCore::IntRect&, bool contentChanged, bool immediate = false, - bool repaintContentOnly = false); + virtual void invalidateWindow(const WebCore::IntRect&, bool); + virtual void invalidateContentsAndWindow(const WebCore::IntRect&, bool); + virtual void invalidateContentsForSlowScroll(const WebCore::IntRect&, bool); virtual void scroll( const WebCore::IntSize& scrollDelta, const WebCore::IntRect& rectToScroll, const WebCore::IntRect& clipRect); @@ -111,34 +117,67 @@ public: virtual void scrollbarsModeDidChange() const; virtual void mouseDidMoveOverElement( const WebCore::HitTestResult& result, unsigned modifierFlags); - virtual void setToolTip(const WebCore::String& tooltipText, WebCore::TextDirection); + virtual void setToolTip(const WTF::String& tooltipText, WebCore::TextDirection); virtual void print(WebCore::Frame*); virtual void exceededDatabaseQuota( - WebCore::Frame*, const WebCore::String& databaseName); + WebCore::Frame*, const WTF::String& databaseName); #if ENABLE(OFFLINE_WEB_APPLICATIONS) virtual void reachedMaxAppCacheSize(int64_t spaceNeeded); + virtual void reachedApplicationCacheOriginQuota(WebCore::SecurityOrigin*); #endif #if ENABLE(NOTIFICATIONS) virtual WebCore::NotificationPresenter* notificationPresenter() const; #endif - virtual void requestGeolocationPermissionForFrame( - WebCore::Frame*, WebCore::Geolocation*) { } + virtual void requestGeolocationPermissionForFrame(WebCore::Frame*, WebCore::Geolocation*); + virtual void cancelGeolocationPermissionRequestForFrame(WebCore::Frame*, WebCore::Geolocation*); virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>); - virtual bool setCursor(WebCore::PlatformCursorHandle) { return false; } + virtual void chooseIconForFiles(const Vector<WTF::String>&, WebCore::FileChooser*); + virtual void setCursor(const WebCore::Cursor&) { } virtual void formStateDidChange(const WebCore::Node*); virtual PassOwnPtr<WebCore::HTMLParserQuirks> createHTMLParserQuirks() { return 0; } +#if ENABLE(TOUCH_EVENTS) + // FIXME: All touch events are forwarded regardless of whether or not they are needed. + virtual void needTouchEvents(bool needTouchEvents) { } +#endif + +#if USE(ACCELERATED_COMPOSITING) + // Pass 0 as the GraphicsLayer to detatch the root layer. + virtual void attachRootGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*); + + // Sets a flag to specify that the next time content is drawn to the window, + // the changes appear on the screen in synchrony with updates to GraphicsLayers. + virtual void setNeedsOneShotDrawingSynchronization() { } + + // Sets a flag to specify that the view needs to be updated, so we need + // to do an eager layout before the drawing. + virtual void scheduleCompositingLayerSync(); + + virtual CompositingTriggerFlags allowedCompositingTriggers() const; +#endif + + virtual bool supportsFullscreenForNode(const WebCore::Node*); + virtual void enterFullscreenForNode(WebCore::Node*); + virtual void exitFullscreenForNode(WebCore::Node*); // ChromeClientChromium methods: virtual void popupOpened(WebCore::PopupContainer* popupContainer, const WebCore::IntRect& bounds, - bool activatable, bool handleExternally); - virtual void didChangeAccessibilityObjectState(WebCore::AccessibilityObject*); + virtual void popupClosed(WebCore::PopupContainer* popupContainer); + virtual void postAccessibilityNotification(WebCore::AccessibilityObject*, WebCore::AXObjectCache::AXNotification); // ChromeClientImpl: void setCursor(const WebCursorInfo& cursor); void setCursorForPlugin(const WebCursorInfo& cursor); + virtual bool selectItemWritingDirectionIsNatural(); + virtual PassRefPtr<WebCore::PopupMenu> createPopupMenu(WebCore::PopupMenuClient*) const; + virtual PassRefPtr<WebCore::SearchPopupMenu> createSearchPopupMenu(WebCore::PopupMenuClient*) const; + +#if ENABLE(CONTEXT_MENUS) + virtual void showContextMenu() { } +#endif + private: void getPopupMenuInfo(WebCore::PopupContainer*, WebPopupMenuInfo*); @@ -148,8 +187,6 @@ private: bool m_scrollbarsVisible; bool m_menubarVisible; bool m_resizable; - // Set to true if the next SetCursor is to be ignored. - bool m_ignoreNextSetCursor; }; } // namespace WebKit diff --git a/WebKit/chromium/src/ChromiumBridge.cpp b/WebKit/chromium/src/ChromiumBridge.cpp index 0fd0825..e9d1da6 100644 --- a/WebKit/chromium/src/ChromiumBridge.cpp +++ b/WebKit/chromium/src/ChromiumBridge.cpp @@ -35,18 +35,25 @@ #include "Chrome.h" #include "ChromeClientImpl.h" +#include "WebAudioBus.h" #include "WebClipboard.h" #include "WebCookie.h" +#include "WebCookieJar.h" #include "WebCursorInfo.h" #include "WebData.h" +#include "WebDragData.h" +#include "WebFileUtilities.h" #include "WebFrameClient.h" #include "WebFrameImpl.h" +#include "WebIDBKey.h" #include "WebImage.h" #include "WebKit.h" #include "WebKitClient.h" #include "WebMimeRegistry.h" #include "WebPluginContainerImpl.h" #include "WebPluginListBuilderImpl.h" +#include "WebSandboxSupport.h" +#include "WebSerializedScriptValue.h" #include "WebScreenInfo.h" #include "WebString.h" #include "WebURL.h" @@ -57,13 +64,13 @@ #if OS(WINDOWS) #include "WebRect.h" -#include "WebSandboxSupport.h" -#include "WebThemeEngine.h" +#include "win/WebThemeEngine.h" #endif -#if OS(LINUX) -#include "WebSandboxSupport.h" +#if OS(LINUX) || OS(FREEBSD) +#include "linux/WebThemeEngine.h" #include "WebFontInfo.h" +#include "WebFontRenderStyle.h" #endif #if WEBKIT_USING_SKIA @@ -74,10 +81,17 @@ #include "Cookie.h" #include "FrameView.h" #include "GraphicsContext.h" +#include "IDBFactoryBackendProxy.h" #include "KURL.h" #include "NotImplemented.h" #include "PlatformContextSkia.h" #include "PluginData.h" +#include "SharedBuffer.h" + +#if !ENABLE(CLIENT_BASED_GEOLOCATION) +#include "WebGeolocationServiceBridgeImpl.h" +#endif + #include "Worker.h" #include "WorkerContextProxy.h" #include <wtf/Assertions.h> @@ -89,6 +103,9 @@ namespace WebCore { static ChromeClientImpl* toChromeClientImpl(Widget* widget) { + if (!widget) + return 0; + FrameView* view; if (widget->isFrameView()) view = static_cast<FrameView*>(widget); @@ -112,6 +129,24 @@ static WebWidgetClient* toWebWidgetClient(Widget* widget) return chromeClientImpl->webView()->client(); } +static WebCookieJar* getCookieJar(const Document* document) +{ + WebFrameImpl* frameImpl = WebFrameImpl::fromFrame(document->frame()); + if (!frameImpl || !frameImpl->client()) + return 0; + WebCookieJar* cookieJar = frameImpl->client()->cookieJar(); + if (!cookieJar) + cookieJar = webKitClient()->cookieJar(); + return cookieJar; +} + +// Cache ---------------------------------------------------------------------- + +void ChromiumBridge::cacheMetadata(const KURL& url, double responseTime, const Vector<char>& data) +{ + webKitClient()->cacheMetadata(url, responseTime, data.data(), data.size()); +} + // Clipboard ------------------------------------------------------------------ bool ChromiumBridge::clipboardIsFormatAvailable( @@ -171,27 +206,85 @@ void ChromiumBridge::clipboardWriteImage(NativeImagePtr image, webKitClient()->clipboard()->writeImage(webImage, sourceURL, title); } +void ChromiumBridge::clipboardWriteData(const String& type, + const String& data, + const String& metadata) +{ + webKitClient()->clipboard()->writeData(type, data, metadata); +} + +HashSet<String> ChromiumBridge::clipboardReadAvailableTypes( + PasteboardPrivate::ClipboardBuffer buffer, bool* containsFilenames) +{ + WebVector<WebString> result = webKitClient()->clipboard()->readAvailableTypes( + static_cast<WebClipboard::Buffer>(buffer), containsFilenames); + HashSet<String> types; + for (size_t i = 0; i < result.size(); ++i) + types.add(result[i]); + return types; +} + +bool ChromiumBridge::clipboardReadData(PasteboardPrivate::ClipboardBuffer buffer, + const String& type, String& data, String& metadata) +{ + WebString resultData; + WebString resultMetadata; + bool succeeded = webKitClient()->clipboard()->readData( + static_cast<WebClipboard::Buffer>(buffer), type, &resultData, &resultMetadata); + if (succeeded) { + data = resultData; + metadata = resultMetadata; + } + return succeeded; +} + +Vector<String> ChromiumBridge::clipboardReadFilenames(PasteboardPrivate::ClipboardBuffer buffer) +{ + WebVector<WebString> result = webKitClient()->clipboard()->readFilenames( + static_cast<WebClipboard::Buffer>(buffer)); + Vector<String> convertedResult; + for (size_t i = 0; i < result.size(); ++i) + convertedResult.append(result[i]); + return convertedResult; +} + // Cookies -------------------------------------------------------------------- -void ChromiumBridge::setCookies(const KURL& url, - const KURL& firstPartyForCookies, - const String& cookie) +void ChromiumBridge::setCookies(const Document* document, const KURL& url, + const String& value) { - webKitClient()->setCookies(url, firstPartyForCookies, cookie); + WebCookieJar* cookieJar = getCookieJar(document); + if (cookieJar) + cookieJar->setCookie(url, document->firstPartyForCookies(), value); } -String ChromiumBridge::cookies(const KURL& url, - const KURL& firstPartyForCookies) +String ChromiumBridge::cookies(const Document* document, const KURL& url) { - return webKitClient()->cookies(url, firstPartyForCookies); + String result; + WebCookieJar* cookieJar = getCookieJar(document); + if (cookieJar) + result = cookieJar->cookies(url, document->firstPartyForCookies()); + return result; } -bool ChromiumBridge::rawCookies(const KURL& url, const KURL& firstPartyForCookies, Vector<Cookie>* rawCookies) +String ChromiumBridge::cookieRequestHeaderFieldValue(const Document* document, + const KURL& url) { - rawCookies->clear(); + String result; + WebCookieJar* cookieJar = getCookieJar(document); + if (cookieJar) + result = cookieJar->cookieRequestHeaderFieldValue(url, document->firstPartyForCookies()); + return result; +} + +bool ChromiumBridge::rawCookies(const Document* document, const KURL& url, Vector<Cookie>& rawCookies) +{ + rawCookies.clear(); WebVector<WebCookie> webCookies; - if (!webKitClient()->rawCookies(url, firstPartyForCookies, &webCookies)) - return false; + + WebCookieJar* cookieJar = getCookieJar(document); + if (cookieJar) + cookieJar->rawCookies(url, document->firstPartyForCookies(), webCookies); for (unsigned i = 0; i < webCookies.size(); ++i) { const WebCookie& webCookie = webCookies[i]; @@ -203,20 +296,25 @@ bool ChromiumBridge::rawCookies(const KURL& url, const KURL& firstPartyForCookie webCookie.httpOnly, webCookie.secure, webCookie.session); - rawCookies->append(cookie); + rawCookies.append(cookie); } return true; } -void ChromiumBridge::deleteCookie(const KURL& url, const String& cookieName) +void ChromiumBridge::deleteCookie(const Document* document, const KURL& url, const String& cookieName) { - webKitClient()->deleteCookie(url, cookieName); + WebCookieJar* cookieJar = getCookieJar(document); + if (cookieJar) + cookieJar->deleteCookie(url, cookieName); } -bool ChromiumBridge::cookiesEnabled(const KURL& url, - const KURL& firstPartyForCookies) +bool ChromiumBridge::cookiesEnabled(const Document* document) { - return webKitClient()->cookiesEnabled(url, firstPartyForCookies); + bool result = false; + WebCookieJar* cookieJar = getCookieJar(document); + if (cookieJar) + result = cookieJar->cookiesEnabled(document->cookieURL(), document->firstPartyForCookies()); + return result; } // DNS ------------------------------------------------------------------------ @@ -230,57 +328,96 @@ void ChromiumBridge::prefetchDNS(const String& hostname) bool ChromiumBridge::fileExists(const String& path) { - return webKitClient()->fileExists(path); + return webKitClient()->fileUtilities()->fileExists(path); } bool ChromiumBridge::deleteFile(const String& path) { - return webKitClient()->deleteFile(path); + return webKitClient()->fileUtilities()->deleteFile(path); } bool ChromiumBridge::deleteEmptyDirectory(const String& path) { - return webKitClient()->deleteEmptyDirectory(path); + return webKitClient()->fileUtilities()->deleteEmptyDirectory(path); } bool ChromiumBridge::getFileSize(const String& path, long long& result) { - return webKitClient()->getFileSize(path, result); + return webKitClient()->fileUtilities()->getFileSize(path, result); +} + +void ChromiumBridge::revealFolderInOS(const String& path) +{ + webKitClient()->fileUtilities()->revealFolderInOS(path); } bool ChromiumBridge::getFileModificationTime(const String& path, time_t& result) { - return webKitClient()->getFileModificationTime(path, result); + double modificationTime; + if (!webKitClient()->fileUtilities()->getFileModificationTime(path, modificationTime)) + return false; + result = static_cast<time_t>(modificationTime); + return true; } String ChromiumBridge::directoryName(const String& path) { - return webKitClient()->directoryName(path); + return webKitClient()->fileUtilities()->directoryName(path); } String ChromiumBridge::pathByAppendingComponent(const String& path, const String& component) { - return webKitClient()->pathByAppendingComponent(path, component); + return webKitClient()->fileUtilities()->pathByAppendingComponent(path, component); } bool ChromiumBridge::makeAllDirectories(const String& path) { - return webKitClient()->makeAllDirectories(path); + return webKitClient()->fileUtilities()->makeAllDirectories(path); } String ChromiumBridge::getAbsolutePath(const String& path) { - return webKitClient()->getAbsolutePath(path); + return webKitClient()->fileUtilities()->getAbsolutePath(path); } bool ChromiumBridge::isDirectory(const String& path) { - return webKitClient()->isDirectory(path); + return webKitClient()->fileUtilities()->isDirectory(path); } KURL ChromiumBridge::filePathToURL(const String& path) { - return webKitClient()->filePathToURL(path); + return webKitClient()->fileUtilities()->filePathToURL(path); +} + +PlatformFileHandle ChromiumBridge::openFile(const String& path, FileOpenMode mode) +{ + return webKitClient()->fileUtilities()->openFile(path, mode); +} + +void ChromiumBridge::closeFile(PlatformFileHandle& handle) +{ + webKitClient()->fileUtilities()->closeFile(handle); +} + +long long ChromiumBridge::seekFile(PlatformFileHandle handle, long long offset, FileSeekOrigin origin) +{ + return webKitClient()->fileUtilities()->seekFile(handle, offset, origin); +} + +bool ChromiumBridge::truncateFile(PlatformFileHandle handle, long long offset) +{ + return webKitClient()->fileUtilities()->truncateFile(handle, offset); +} + +int ChromiumBridge::readFromFile(PlatformFileHandle handle, char* data, int length) +{ + return webKitClient()->fileUtilities()->readFromFile(handle, data, length); +} + +int ChromiumBridge::writeToFile(PlatformFileHandle handle, const char* data, int length) +{ + return webKitClient()->fileUtilities()->writeToFile(handle, data, length); } // Font ----------------------------------------------------------------------- @@ -296,7 +433,7 @@ bool ChromiumBridge::ensureFontLoaded(HFONT font) } #endif -#if OS(LINUX) +#if OS(LINUX) || OS(FREEBSD) String ChromiumBridge::getFontFamilyForCharacters(const UChar* characters, size_t numCharacters) { if (webKitClient()->sandboxSupport()) @@ -308,14 +445,50 @@ String ChromiumBridge::getFontFamilyForCharacters(const UChar* characters, size_ return WebString(); } + +void ChromiumBridge::getRenderStyleForStrike(const char* font, int sizeAndStyle, FontRenderStyle* result) +{ + WebFontRenderStyle style; + + if (webKitClient()->sandboxSupport()) + webKitClient()->sandboxSupport()->getRenderStyleForStrike(font, sizeAndStyle, &style); + else + WebFontInfo::renderStyleForStrike(font, sizeAndStyle, &style); + + style.toFontRenderStyle(result); +} +#endif + +#if OS(DARWIN) +bool ChromiumBridge::loadFont(NSFont* srcFont, ATSFontContainerRef* out) +{ + WebSandboxSupport* ss = webKitClient()->sandboxSupport(); + if (ss) + return ss->loadFont(srcFont, out); + + // This function should only be called in response to an error loading a + // font due to being blocked by the sandbox. + // This by definition shouldn't happen if there is no sandbox support. + ASSERT_NOT_REACHED(); + *out = 0; + return false; +} #endif -// HTML5 DB ------------------------------------------------------------------- +#if !ENABLE(CLIENT_BASED_GEOLOCATION) +// Geolocation ---------------------------------------------------------------- -#if ENABLE(DATABASE) -PlatformFileHandle ChromiumBridge::databaseOpenFile(const String& vfsFileName, int desiredFlags, PlatformFileHandle* dirHandle) +GeolocationServiceBridge* ChromiumBridge::createGeolocationServiceBridge(GeolocationServiceChromium* geolocationServiceChromium) { - return webKitClient()->databaseOpenFile(WebString(vfsFileName), desiredFlags, dirHandle); + return createGeolocationServiceBridgeImpl(geolocationServiceChromium); +} +#endif + +// Databases ------------------------------------------------------------------ + +PlatformFileHandle ChromiumBridge::databaseOpenFile(const String& vfsFileName, int desiredFlags) +{ + return webKitClient()->databaseOpenFile(WebString(vfsFileName), desiredFlags); } int ChromiumBridge::databaseDeleteFile(const String& vfsFileName, bool syncDir) @@ -332,7 +505,33 @@ long long ChromiumBridge::databaseGetFileSize(const String& vfsFileName) { return webKitClient()->databaseGetFileSize(WebString(vfsFileName)); } -#endif + +// Indexed Database ----------------------------------------------------------- + +PassRefPtr<IDBFactoryBackendInterface> ChromiumBridge::idbFactory() +{ + // There's no reason why we need to allocate a new proxy each time, but + // there's also no strong reason not to. + return IDBFactoryBackendProxy::create(); +} + +void ChromiumBridge::idbShutdown() +{ + // In the browser process, this shuts down the utility process. In the renderer process, it does nothing. + webKitClient()->idbShutdown(); +} + +void ChromiumBridge::createIDBKeysFromSerializedValuesAndKeyPath(const Vector<RefPtr<SerializedScriptValue> >& values, const String& keyPath, Vector<RefPtr<IDBKey> >& keys) +{ + WebVector<WebSerializedScriptValue> webValues = values; + WebVector<WebIDBKey> webKeys; + webKitClient()->createIDBKeysFromSerializedValuesAndKeyPath(webValues, WebString(keyPath), webKeys); + + size_t webKeysSize = webKeys.size(); + keys.reserveCapacity(webKeysSize); + for (size_t i = 0; i < webKeysSize; ++i) + keys.append(PassRefPtr<IDBKey>(webKeys[i])); +} // Keygen --------------------------------------------------------------------- @@ -395,7 +594,7 @@ String ChromiumBridge::preferredExtensionForMIMEType(const String& mimeType) // Plugin --------------------------------------------------------------------- -bool ChromiumBridge::plugins(bool refresh, Vector<PluginInfo*>* results) +bool ChromiumBridge::plugins(bool refresh, Vector<PluginInfo>* results) { WebPluginListBuilderImpl builder(results); webKitClient()->getPluginList(refresh, &builder); @@ -404,14 +603,9 @@ bool ChromiumBridge::plugins(bool refresh, Vector<PluginInfo*>* results) NPObject* ChromiumBridge::pluginScriptableObject(Widget* widget) { - if (!widget) + if (!widget || !widget->isPluginContainer()) return 0; - ASSERT(!widget->isFrameView()); - - // NOTE: We have to trust that the widget passed to us here is a - // WebPluginContainerImpl. There isn't a way to dynamically verify it, - // since the derived class (Widget) has no identifier. return static_cast<WebPluginContainerImpl*>(widget)->scriptableObject(); } @@ -428,6 +622,27 @@ PassRefPtr<Image> ChromiumBridge::loadPlatformImageResource(const char* name) return image; } +#if ENABLE(WEB_AUDIO) + +PassOwnPtr<AudioBus> ChromiumBridge::loadPlatformAudioResource(const char* name, double sampleRate) +{ + const WebData& resource = webKitClient()->loadResource(name); + if (resource.isEmpty()) + return 0; + + return decodeAudioFileData(resource.data(), resource.size(), sampleRate); +} + +PassOwnPtr<AudioBus> ChromiumBridge::decodeAudioFileData(const char* data, size_t size, double sampleRate) +{ + WebAudioBus webAudioBus; + if (webKitClient()->decodeAudioFileData(&webAudioBus, data, size, sampleRate)) + return webAudioBus.release(); + return 0; +} + +#endif // ENABLE(WEB_AUDIO) + // Sandbox -------------------------------------------------------------------- bool ChromiumBridge::sandboxEnabled() @@ -464,6 +679,16 @@ void ChromiumBridge::incrementStatsCounter(const char* name) webKitClient()->incrementStatsCounter(name); } +void ChromiumBridge::histogramCustomCounts(const char* name, int sample, int min, int max, int bucketCount) +{ + webKitClient()->histogramCustomCounts(name, sample, min, max, bucketCount); +} + +void ChromiumBridge::histogramEnumeration(const char* name, int sample, int boundaryValue) +{ + webKitClient()->histogramEnumeration(name, sample, boundaryValue); +} + // Sudden Termination --------------------------------------------------------- void ChromiumBridge::suddenTerminationChanged(bool enabled) @@ -523,6 +748,14 @@ void ChromiumBridge::paintScrollbarTrack( alignRect); } +void ChromiumBridge::paintSpinButton( + GraphicsContext* gc, int part, int state, int classicState, + const IntRect& rect) +{ + webKitClient()->themeEngine()->paintSpinButton( + gc->platformContext()->canvas(), part, state, classicState, rect); +} + void ChromiumBridge::paintTextField( GraphicsContext* gc, int part, int state, int classicState, const IntRect& rect, const Color& color, bool fillContentArea, @@ -544,6 +777,67 @@ void ChromiumBridge::paintTrackbar( gc->platformContext()->canvas(), part, state, classicState, rect); } +void ChromiumBridge::paintProgressBar( + GraphicsContext* gc, const IntRect& barRect, const IntRect& valueRect, bool determinate, double animatedSeconds) +{ + webKitClient()->themeEngine()->paintProgressBar( + gc->platformContext()->canvas(), barRect, valueRect, determinate, animatedSeconds); +} + +#elif OS(LINUX) + +static WebThemeEngine::Part WebThemePart(ChromiumBridge::ThemePart part) +{ + switch (part) { + case ChromiumBridge::PartScrollbarDownArrow: return WebThemeEngine::PartScrollbarDownArrow; + case ChromiumBridge::PartScrollbarLeftArrow: return WebThemeEngine::PartScrollbarLeftArrow; + case ChromiumBridge::PartScrollbarRightArrow: return WebThemeEngine::PartScrollbarRightArrow; + case ChromiumBridge::PartScrollbarUpArrow: return WebThemeEngine::PartScrollbarUpArrow; + case ChromiumBridge::PartScrollbarHorizontalThumb: return WebThemeEngine::PartScrollbarHorizontalThumb; + case ChromiumBridge::PartScrollbarVerticalThumb: return WebThemeEngine::PartScrollbarVerticalThumb; + case ChromiumBridge::PartScrollbarHoriztonalTrack: return WebThemeEngine::PartScrollbarHoriztonalTrack; + case ChromiumBridge::PartScrollbarVerticalTrack: return WebThemeEngine::PartScrollbarVerticalTrack; + } + ASSERT_NOT_REACHED(); + return WebThemeEngine::PartScrollbarDownArrow; +} + +static WebThemeEngine::State WebThemeState(ChromiumBridge::ThemePaintState state) +{ + switch (state) { + case ChromiumBridge::StateDisabled: return WebThemeEngine::StateDisabled; + case ChromiumBridge::StateHover: return WebThemeEngine::StateHover; + case ChromiumBridge::StateNormal: return WebThemeEngine::StateNormal; + case ChromiumBridge::StatePressed: return WebThemeEngine::StatePressed; + } + ASSERT_NOT_REACHED(); + return WebThemeEngine::StateDisabled; +} + +static void GetWebThemeExtraParams(ChromiumBridge::ThemePart part, ChromiumBridge::ThemePaintState state, const ChromiumBridge::ThemePaintExtraParams* extraParams, WebThemeEngine::ExtraParams* webThemeExtraParams) +{ + if (part == ChromiumBridge::PartScrollbarHoriztonalTrack || part == ChromiumBridge::PartScrollbarVerticalTrack) { + webThemeExtraParams->scrollbarTrack.trackX = extraParams->scrollbarTrack.trackX; + webThemeExtraParams->scrollbarTrack.trackY = extraParams->scrollbarTrack.trackY; + webThemeExtraParams->scrollbarTrack.trackWidth = extraParams->scrollbarTrack.trackWidth; + webThemeExtraParams->scrollbarTrack.trackHeight = extraParams->scrollbarTrack.trackHeight; + } +} + +IntSize ChromiumBridge::getThemePartSize(ThemePart part) +{ + return webKitClient()->themeEngine()->getSize(WebThemePart(part)); +} + +void ChromiumBridge::paintThemePart( + GraphicsContext* gc, ThemePart part, ThemePaintState state, const IntRect& rect, const ThemePaintExtraParams* extraParams) +{ + WebThemeEngine::ExtraParams webThemeExtraParams; + GetWebThemeExtraParams(part, state, extraParams, &webThemeExtraParams); + webKitClient()->themeEngine()->paint( + gc->platformContext()->canvas(), WebThemePart(part), WebThemeState(state), rect, &webThemeExtraParams); +} + #endif // Trace Event ---------------------------------------------------------------- @@ -628,6 +922,11 @@ int ChromiumBridge::memoryUsageMB() return static_cast<int>(webKitClient()->memoryUsageMB()); } +int ChromiumBridge::actualMemoryUsageMB() +{ + return static_cast<int>(webKitClient()->actualMemoryUsageMB()); +} + int ChromiumBridge::screenDepth(Widget* widget) { WebWidgetClient* client = toWebWidgetClient(widget); @@ -681,13 +980,6 @@ void ChromiumBridge::widgetSetCursor(Widget* widget, const Cursor& cursor) client->setCursor(WebCursorInfo(cursor)); } -void ChromiumBridge::widgetSetFocus(Widget* widget) -{ - ChromeClientImpl* client = toChromeClientImpl(widget); - if (client) - client->focus(); -} - WorkerContextProxy* WorkerContextProxy::create(Worker* worker) { return WebWorkerClientImpl::createWorkerContextProxy(worker); diff --git a/WebKit/chromium/src/ChromiumThreading.cpp b/WebKit/chromium/src/ChromiumThreading.cpp index 902a433..c6fefac 100644 --- a/WebKit/chromium/src/ChromiumThreading.cpp +++ b/WebKit/chromium/src/ChromiumThreading.cpp @@ -38,13 +38,9 @@ namespace WTF { -void ChromiumThreading::initializeMainThread() +void ChromiumThreading::callOnMainThread(void (*func)(void*), void* context) { -} - -void ChromiumThreading::scheduleDispatchFunctionsOnMainThread() -{ - WebKit::webKitClient()->callOnMainThread(&WTF::dispatchFunctionsFromMainThread); + WebKit::webKitClient()->callOnMainThread(func, context); } } // namespace WTF diff --git a/WebKit/chromium/src/DebuggerAgent.h b/WebKit/chromium/src/CompositionUnderlineBuilder.h index 17cde11..ce62474 100644 --- a/WebKit/chromium/src/DebuggerAgent.h +++ b/WebKit/chromium/src/CompositionUnderlineBuilder.h @@ -28,29 +28,25 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef DebuggerAgent_h -#define DebuggerAgent_h +#ifndef CompositionUnderlineBuilder_h +#define CompositionUnderlineBuilder_h -#include "DevToolsRPC.h" +#include "Editor.h" +#include "Vector.h" +#include "WebCompositionUnderline.h" +#include "WebVector.h" namespace WebKit { -#define DEBUGGER_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \ - /* Requests global context id of the inspected tab. */ \ - METHOD0(getContextId) \ - \ - /* Request v8 to process all debug commands in the queue. */ \ - METHOD0(processDebugCommands) +// This class is used for converting from WebCompositionUnderline to +// WebCore::CompositionUnderline. -DEFINE_RPC_CLASS(DebuggerAgent, DEBUGGER_AGENT_STRUCT) - -#define DEBUGGER_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \ - METHOD1(debuggerOutput, String /* output text */) \ - \ - /* Pushes debugger context id into the client. */ \ - METHOD1(setContextId, int /* context id */) - -DEFINE_RPC_CLASS(DebuggerAgentDelegate, DEBUGGER_AGENT_DELEGATE_STRUCT) +class CompositionUnderlineBuilder : public WebCore::CompositionUnderline { +public: + CompositionUnderlineBuilder(const WebCompositionUnderline& u) + : WebCore::CompositionUnderline(u.startOffset, u.endOffset, + WebCore::Color(u.color), u.thick) { } +}; } // namespace WebKit diff --git a/WebKit/chromium/src/ProfilerAgentImpl.cpp b/WebKit/chromium/src/CompositionUnderlineVectorBuilder.cpp index 07570df..55dca85 100644 --- a/WebKit/chromium/src/ProfilerAgentImpl.cpp +++ b/WebKit/chromium/src/CompositionUnderlineVectorBuilder.cpp @@ -29,24 +29,21 @@ */ #include "config.h" -#include "ProfilerAgentImpl.h" +#include "CompositionUnderlineVectorBuilder.h" -#include <v8.h> +#include "CompositionUnderlineBuilder.h" -namespace WebKit { +using namespace WebCore; -void ProfilerAgentImpl::getActiveProfilerModules() -{ - m_delegate->didGetActiveProfilerModules(v8::V8::GetActiveProfilerModules()); -} +namespace WebKit { -void ProfilerAgentImpl::getLogLines(int position) +CompositionUnderlineVectorBuilder::CompositionUnderlineVectorBuilder( + const WebVector<WebCompositionUnderline>& underlines) { - static char buffer[65536]; - const int readSize = v8::V8::GetLogLines(position, buffer, sizeof(buffer) - 1); - buffer[readSize] = '\0'; - position += readSize; - m_delegate->didGetLogLines(position, buffer); + size_t size = underlines.size(); + reserveCapacity(size); + for (size_t i = 0; i < size; ++i) + append(CompositionUnderlineBuilder(underlines[i])); } } // namespace WebKit diff --git a/WebKit/chromium/src/ProfilerAgentImpl.h b/WebKit/chromium/src/CompositionUnderlineVectorBuilder.h index d38f57c..8050f02 100644 --- a/WebKit/chromium/src/ProfilerAgentImpl.h +++ b/WebKit/chromium/src/CompositionUnderlineVectorBuilder.h @@ -28,28 +28,24 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef ProfilerAgentImpl_h -#define ProfilerAgentImpl_h +#ifndef CompositionUnderlineVectorBuilder_h +#define CompositionUnderlineVectorBuilder_h -#include "ProfilerAgent.h" +#include "Editor.h" +#include "Vector.h" +#include "WebCompositionUnderline.h" +#include "WebVector.h" namespace WebKit { -class ProfilerAgentImpl : public ProfilerAgent { -public: - ProfilerAgentImpl(ProfilerAgentDelegate* delegate) : m_delegate(delegate) { } - virtual ~ProfilerAgentImpl() { } - - // ProfilerAgent implementation. - - // This method is called on IO thread. - virtual void getActiveProfilerModules(); +// This classes are used for converting from std::vector<WebCompositionUnderline> +// to Vector<WebCore::CompositionUnderline>. - // This method is called on IO thread. - virtual void getLogLines(int position); - -private: - ProfilerAgentDelegate* m_delegate; +class CompositionUnderlineVectorBuilder : + public Vector<WebCore::CompositionUnderline> { +public: + CompositionUnderlineVectorBuilder( + const WebVector<WebCompositionUnderline>&); }; } // namespace WebKit diff --git a/WebKit/chromium/src/ContextMenuClientImpl.cpp b/WebKit/chromium/src/ContextMenuClientImpl.cpp index 8472082..d33a06b 100644 --- a/WebKit/chromium/src/ContextMenuClientImpl.cpp +++ b/WebKit/chromium/src/ContextMenuClientImpl.cpp @@ -46,6 +46,7 @@ #include "KURL.h" #include "MediaError.h" #include "PlatformString.h" +#include "RenderWidget.h" #include "TextBreakIterator.h" #include "Widget.h" @@ -53,6 +54,8 @@ #include "WebDataSourceImpl.h" #include "WebFrameImpl.h" #include "WebMenuItemInfo.h" +#include "WebPlugin.h" +#include "WebPluginContainerImpl.h" #include "WebPoint.h" #include "WebString.h" #include "WebURL.h" @@ -95,7 +98,7 @@ static bool isASingleWord(const String& text) static String selectMisspelledWord(const ContextMenu* defaultMenu, Frame* selectedFrame) { // First select from selectedText to check for multiple word selection. - String misspelledWord = selectedFrame->selectedText().stripWhiteSpace(); + String misspelledWord = selectedFrame->editor()->selectedText().stripWhiteSpace(); // If some texts were already selected, we don't change the selection. if (!misspelledWord.isEmpty()) { @@ -116,7 +119,7 @@ static String selectMisspelledWord(const ContextMenu* defaultMenu, Frame* select return misspelledWord; // It is empty. WebFrameImpl::selectWordAroundPosition(selectedFrame, pos); - misspelledWord = selectedFrame->selectedText().stripWhiteSpace(); + misspelledWord = selectedFrame->editor()->selectedText().stripWhiteSpace(); #if OS(DARWIN) // If misspelled word is still empty, then that portion should not be @@ -147,13 +150,28 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems( WebContextMenuData data; data.mousePosition = selectedFrame->view()->contentsToWindow(r.point()); + // Compute edit flags. + data.editFlags = WebContextMenuData::CanDoNone; + if (m_webView->focusedWebCoreFrame()->editor()->canUndo()) + data.editFlags |= WebContextMenuData::CanUndo; + if (m_webView->focusedWebCoreFrame()->editor()->canRedo()) + data.editFlags |= WebContextMenuData::CanRedo; + if (m_webView->focusedWebCoreFrame()->editor()->canCut()) + data.editFlags |= WebContextMenuData::CanCut; + if (m_webView->focusedWebCoreFrame()->editor()->canCopy()) + data.editFlags |= WebContextMenuData::CanCopy; + if (m_webView->focusedWebCoreFrame()->editor()->canPaste()) + data.editFlags |= WebContextMenuData::CanPaste; + if (m_webView->focusedWebCoreFrame()->editor()->canDelete()) + data.editFlags |= WebContextMenuData::CanDelete; + // We can always select all... + data.editFlags |= WebContextMenuData::CanSelectAll; + data.editFlags |= WebContextMenuData::CanTranslate; + // Links, Images, Media tags, and Image/Media-Links take preference over // all else. data.linkURL = r.absoluteLinkURL(); - data.mediaType = WebContextMenuData::MediaTypeNone; - data.mediaFlags = WebContextMenuData::MediaNone; - if (!r.absoluteImageURL().isEmpty()) { data.srcURL = r.absoluteImageURL(); data.mediaType = WebContextMenuData::MediaTypeImage; @@ -181,10 +199,34 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems( data.mediaFlags |= WebContextMenuData::MediaCanSave; if (mediaElement->hasAudio()) data.mediaFlags |= WebContextMenuData::MediaHasAudio; + if (mediaElement->hasVideo()) + data.mediaFlags |= WebContextMenuData::MediaHasVideo; + if (mediaElement->controls()) + data.mediaFlags |= WebContextMenuData::MediaControls; + } else if (r.innerNonSharedNode()->hasTagName(HTMLNames::objectTag) + || r.innerNonSharedNode()->hasTagName(HTMLNames::embedTag)) { + RenderObject* object = r.innerNonSharedNode()->renderer(); + if (object && object->isWidget()) { + Widget* widget = toRenderWidget(object)->widget(); + if (widget && widget->isPluginContainer()) { + WebPluginContainerImpl* plugin = static_cast<WebPluginContainerImpl*>(widget); + WebString text = plugin->plugin()->selectionAsText(); + if (!text.isEmpty()) { + data.selectedText = text; + data.editFlags |= WebContextMenuData::CanCopy; + } + data.editFlags &= ~WebContextMenuData::CanTranslate; + data.linkURL = plugin->plugin()->linkAtPosition(data.mousePosition); + } + } } + + data.isImageBlocked = + (data.mediaType == WebContextMenuData::MediaTypeImage) && !r.image(); + // If it's not a link, an image, a media element, or an image/media link, // show a selection menu or a more generic page menu. - data.frameEncoding = selectedFrame->loader()->encoding(); + data.frameEncoding = selectedFrame->loader()->writer()->encoding(); // Send the frame and page URLs in any case. data.pageURL = urlFromFrame(m_webView->mainFrameImpl()->frame()); @@ -192,23 +234,19 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems( data.frameURL = urlFromFrame(selectedFrame); if (r.isSelected()) - data.selectedText = selectedFrame->selectedText().stripWhiteSpace(); + data.selectedText = selectedFrame->editor()->selectedText().stripWhiteSpace(); - data.isEditable = false; if (r.isContentEditable()) { data.isEditable = true; if (m_webView->focusedWebCoreFrame()->editor()->isContinuousSpellCheckingEnabled()) { data.isSpellCheckingEnabled = true; - data.misspelledWord = selectMisspelledWord(defaultMenu, selectedFrame); + // Spellchecking might be enabled for the field, but could be disabled on the node. + if (m_webView->focusedWebCoreFrame()->editor()->isSpellCheckingEnabledInFocusedNode()) + data.misspelledWord = selectMisspelledWord(defaultMenu, selectedFrame); } } #if OS(DARWIN) - // Writing direction context menu. - data.writingDirectionDefault = WebContextMenuData::CheckableMenuItemDisabled; - data.writingDirectionLeftToRight = WebContextMenuData::CheckableMenuItemEnabled; - data.writingDirectionRightToLeft = WebContextMenuData::CheckableMenuItemEnabled; - ExceptionCode ec = 0; RefPtr<CSSStyleDeclaration> style = selectedFrame->document()->createCSSStyleDeclaration(); style->setProperty(CSSPropertyDirection, "ltr", false, ec); @@ -225,23 +263,6 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems( if (ds) data.securityInfo = ds->response().securityInfo(); - // Compute edit flags. - data.editFlags = WebContextMenuData::CanDoNone; - if (m_webView->focusedWebCoreFrame()->editor()->canUndo()) - data.editFlags |= WebContextMenuData::CanUndo; - if (m_webView->focusedWebCoreFrame()->editor()->canRedo()) - data.editFlags |= WebContextMenuData::CanRedo; - if (m_webView->focusedWebCoreFrame()->editor()->canCut()) - data.editFlags |= WebContextMenuData::CanCut; - if (m_webView->focusedWebCoreFrame()->editor()->canCopy()) - data.editFlags |= WebContextMenuData::CanCopy; - if (m_webView->focusedWebCoreFrame()->editor()->canPaste()) - data.editFlags |= WebContextMenuData::CanPaste; - if (m_webView->focusedWebCoreFrame()->editor()->canDelete()) - data.editFlags |= WebContextMenuData::CanDelete; - // We can always select all... - data.editFlags |= WebContextMenuData::CanSelectAll; - // Filter out custom menu elements and add them into the data. populateCustomMenuItems(defaultMenu, &data); @@ -257,7 +278,7 @@ void ContextMenuClientImpl::populateCustomMenuItems(WebCore::ContextMenu* defaul Vector<WebMenuItemInfo> customItems; for (size_t i = 0; i < defaultMenu->itemCount(); ++i) { ContextMenuItem* inputItem = defaultMenu->itemAtIndex(i, defaultMenu->platformDescription()); - if (inputItem->action() < ContextMenuItemBaseCustomTag || inputItem->action() >= ContextMenuItemBaseApplicationTag) + if (inputItem->action() < ContextMenuItemBaseCustomTag || inputItem->action() > ContextMenuItemLastCustomTag) continue; WebMenuItemInfo outputItem; diff --git a/WebKit/chromium/src/ContextMenuClientImpl.h b/WebKit/chromium/src/ContextMenuClientImpl.h index 4191fad..97ea967 100644 --- a/WebKit/chromium/src/ContextMenuClientImpl.h +++ b/WebKit/chromium/src/ContextMenuClientImpl.h @@ -51,7 +51,7 @@ public: virtual void lookUpInDictionary(WebCore::Frame*) {} virtual void searchWithGoogle(const WebCore::Frame*) {} virtual bool shouldIncludeInspectElementItem() { return false; } - virtual void speak(const WebCore::String&) {} + virtual void speak(const WTF::String&) {} virtual void stopSpeaking() {} private: void populateCustomMenuItems(WebCore::ContextMenu*, WebContextMenuData*); diff --git a/WebKit/chromium/src/DOMUtilitiesPrivate.cpp b/WebKit/chromium/src/DOMUtilitiesPrivate.cpp index 4081db6..6f952f7 100644 --- a/WebKit/chromium/src/DOMUtilitiesPrivate.cpp +++ b/WebKit/chromium/src/DOMUtilitiesPrivate.cpp @@ -97,7 +97,7 @@ bool elementHasLegalLinkAttribute(const Element* element, if (element->hasTagName(HTMLNames::inputTag)) { const HTMLInputElement* input = static_cast<const HTMLInputElement*>(element); - if (input->inputType() == HTMLInputElement::IMAGE) + if (input->isImageButton()) return true; } } else if (attrName == HTMLNames::hrefAttr) { diff --git a/WebKit/chromium/src/DOMUtilitiesPrivate.h b/WebKit/chromium/src/DOMUtilitiesPrivate.h index 253ab3f..f5d03a5 100644 --- a/WebKit/chromium/src/DOMUtilitiesPrivate.h +++ b/WebKit/chromium/src/DOMUtilitiesPrivate.h @@ -31,6 +31,8 @@ #ifndef DOMUtilitiesPrivate_h #define DOMUtilitiesPrivate_h +#include <wtf/Forward.h> + namespace WebCore { class Element; class HTMLInputElement; @@ -39,7 +41,6 @@ class HTMLMetaElement; class HTMLOptionElement; class Node; class QualifiedName; -class String; } // This file is an aggregate of useful WebCore operations. @@ -53,7 +54,7 @@ WebCore::HTMLMetaElement* toHTMLMetaElement(WebCore::Node*); WebCore::HTMLOptionElement* toHTMLOptionElement(WebCore::Node*); // FIXME: Deprecate. Use WebInputElement::nameForAutofill instead. -WebCore::String nameOfInputElement(WebCore::HTMLInputElement*); +WTF::String nameOfInputElement(WebCore::HTMLInputElement*); // For img, script, iframe, frame element, when attribute name is src, // for link, a, area element, when attribute name is href, diff --git a/WebKit/chromium/src/DatabaseObserver.cpp b/WebKit/chromium/src/DatabaseObserver.cpp index 54e93e1..f43c9bd 100644 --- a/WebKit/chromium/src/DatabaseObserver.cpp +++ b/WebKit/chromium/src/DatabaseObserver.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2010 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -31,30 +31,60 @@ #include "config.h" #include "DatabaseObserver.h" -#include "Database.h" +#if ENABLE(DATABASE) + +#include "AbstractDatabase.h" +#include "Document.h" +#include "ScriptExecutionContext.h" #include "WebDatabase.h" #include "WebDatabaseObserver.h" +#include "WebFrameClient.h" +#include "WebFrameImpl.h" +#include "WebSecurityOrigin.h" +#include "WebWorkerImpl.h" +#include "WorkerContext.h" +#include "WorkerThread.h" using namespace WebKit; namespace WebCore { -void DatabaseObserver::databaseOpened(Database* database) +bool DatabaseObserver::canEstablishDatabase(ScriptExecutionContext* scriptExecutionContext, const String& name, const String& displayName, unsigned long estimatedSize) +{ + ASSERT(scriptExecutionContext->isContextThread()); + ASSERT(scriptExecutionContext->isDocument() || scriptExecutionContext->isWorkerContext()); + if (scriptExecutionContext->isDocument()) { + Document* document = static_cast<Document*>(scriptExecutionContext); + WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame()); + return webFrame->client()->allowDatabase(webFrame, name, displayName, estimatedSize); + } else { + WorkerContext* workerContext = static_cast<WorkerContext*>(scriptExecutionContext); + WorkerLoaderProxy* workerLoaderProxy = &workerContext->thread()->workerLoaderProxy(); + WebWorkerBase* webWorker = static_cast<WebWorkerBase*>(workerLoaderProxy); + return webWorker->allowDatabase(0, name, displayName, estimatedSize); + } + + return true; +} + +void DatabaseObserver::databaseOpened(AbstractDatabase* database) { - ASSERT(isMainThread()); + ASSERT(database->scriptExecutionContext()->isContextThread()); WebDatabase::observer()->databaseOpened(WebDatabase(database)); } -void DatabaseObserver::databaseModified(Database* database) +void DatabaseObserver::databaseModified(AbstractDatabase* database) { - ASSERT(isMainThread()); + ASSERT(database->scriptExecutionContext()->isContextThread()); WebDatabase::observer()->databaseModified(WebDatabase(database)); } -void DatabaseObserver::databaseClosed(Database* database) +void DatabaseObserver::databaseClosed(AbstractDatabase* database) { - ASSERT(isMainThread()); + ASSERT(database->scriptExecutionContext()->isContextThread()); WebDatabase::observer()->databaseClosed(WebDatabase(database)); } } // namespace WebCore + +#endif // ENABLE(DATABASE) diff --git a/WebKit/chromium/src/DebuggerAgentImpl.cpp b/WebKit/chromium/src/DebuggerAgentImpl.cpp index d592710..5dd5c58 100644 --- a/WebKit/chromium/src/DebuggerAgentImpl.cpp +++ b/WebKit/chromium/src/DebuggerAgentImpl.cpp @@ -32,38 +32,21 @@ #include "DebuggerAgentImpl.h" #include "DebuggerAgentManager.h" -#include "Document.h" -#include "Frame.h" -#include "Page.h" -#include "V8Binding.h" -#include "V8DOMWindow.h" -#include "V8Index.h" -#include "V8Proxy.h" +#include "WebDevToolsAgentClient.h" #include "WebDevToolsAgentImpl.h" #include "WebViewImpl.h" -#include <wtf/HashSet.h> -#include <wtf/RefPtr.h> -#include <wtf/Vector.h> -using WebCore::DOMWindow; -using WebCore::Document; -using WebCore::Frame; -using WebCore::Page; -using WebCore::String; -using WebCore::V8ClassIndex; -using WebCore::V8DOMWindow; -using WebCore::V8DOMWrapper; -using WebCore::V8Proxy; +using WTF::String; namespace WebKit { DebuggerAgentImpl::DebuggerAgentImpl( WebViewImpl* webViewImpl, - DebuggerAgentDelegate* delegate, - WebDevToolsAgentImpl* webdevtoolsAgent) + WebDevToolsAgentImpl* webdevtoolsAgent, + WebDevToolsAgentClient* webdevtoolsAgentClient) : m_webViewImpl(webViewImpl) - , m_delegate(delegate) , m_webdevtoolsAgent(webdevtoolsAgent) + , m_webdevtoolsAgentClient(webdevtoolsAgentClient) , m_autoContinueOnException(false) { DebuggerAgentManager::debugAttach(this); @@ -74,125 +57,9 @@ DebuggerAgentImpl::~DebuggerAgentImpl() DebuggerAgentManager::debugDetach(this); } -void DebuggerAgentImpl::getContextId() -{ - m_delegate->setContextId(m_webdevtoolsAgent->hostId()); -} - -void DebuggerAgentImpl::processDebugCommands() -{ - DebuggerAgentManager::UtilityContextScope utilityScope; - v8::Debug::ProcessDebugMessages(); -} - void DebuggerAgentImpl::debuggerOutput(const String& command) { - m_delegate->debuggerOutput(command); - m_webdevtoolsAgent->forceRepaint(); -} - -// static -void DebuggerAgentImpl::createUtilityContext(Frame* frame, v8::Persistent<v8::Context>* context) -{ - v8::HandleScope scope; - bool canExecuteScripts = frame->script()->canExecuteScripts(); - - // Set up the DOM window as the prototype of the new global object. - v8::Handle<v8::Context> windowContext = V8Proxy::context(frame); - v8::Handle<v8::Object> windowGlobal; - v8::Handle<v8::Object> windowWrapper; - if (canExecuteScripts) { - // FIXME: This check prevents renderer from crashing, while providing limited capabilities for - // DOM inspection, Resources tracking, no scripts support, some timeline profiling. Console will - // result in exceptions for each evaluation. There is still some work that needs to be done in - // order to polish the script-less experience. - windowGlobal = windowContext->Global(); - windowWrapper = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), windowGlobal); - ASSERT(V8DOMWindow::toNative(windowWrapper) == frame->domWindow()); - } - - v8::Handle<v8::ObjectTemplate> globalTemplate = v8::ObjectTemplate::New(); - - // TODO(yurys): provide a function in v8 bindings that would make the - // utility context more like main world context of the inspected frame, - // otherwise we need to manually make it satisfy various invariants - // that V8Proxy::getEntered and some other V8Proxy methods expect to find - // on v8 contexts on the contexts stack. - // See V8Proxy::createNewContext. - // - // Install a security handler with V8. - globalTemplate->SetAccessCheckCallbacks( - V8DOMWindow::namedSecurityCheck, - V8DOMWindow::indexedSecurityCheck, - v8::Integer::New(V8ClassIndex::DOMWINDOW)); - // We set number of internal fields to match that in V8DOMWindow wrapper. - // See http://crbug.com/28961 - globalTemplate->SetInternalFieldCount(V8DOMWindow::internalFieldCount); - - *context = v8::Context::New(0 /* no extensions */, globalTemplate, v8::Handle<v8::Object>()); - v8::Context::Scope contextScope(*context); - v8::Handle<v8::Object> global = (*context)->Global(); - - v8::Handle<v8::String> implicitProtoString = v8::String::New("__proto__"); - if (canExecuteScripts) - global->Set(implicitProtoString, windowWrapper); - - // Give the code running in the new context a way to get access to the - // original context. - if (canExecuteScripts) - global->Set(v8::String::New("contentWindow"), windowGlobal); -} - -String DebuggerAgentImpl::executeUtilityFunction( - v8::Handle<v8::Context> context, - int callId, - const char* object, - const String &functionName, - const String& jsonArgs, - bool async, - String* exception) -{ - v8::HandleScope scope; - ASSERT(!context.IsEmpty()); - if (context.IsEmpty()) { - *exception = "No window context."; - return ""; - } - v8::Context::Scope contextScope(context); - - DebuggerAgentManager::UtilityContextScope utilityScope; - - v8::Handle<v8::Object> dispatchObject = v8::Handle<v8::Object>::Cast( - context->Global()->Get(v8::String::New(object))); - - v8::Handle<v8::Value> dispatchFunction = dispatchObject->Get(v8::String::New("dispatch")); - ASSERT(dispatchFunction->IsFunction()); - v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(dispatchFunction); - - v8::Handle<v8::String> functionNameWrapper = v8::Handle<v8::String>( - v8::String::New(functionName.utf8().data())); - v8::Handle<v8::String> jsonArgsWrapper = v8::Handle<v8::String>( - v8::String::New(jsonArgs.utf8().data())); - v8::Handle<v8::Number> callIdWrapper = v8::Handle<v8::Number>( - v8::Number::New(async ? callId : 0)); - - v8::Handle<v8::Value> args[] = { - functionNameWrapper, - jsonArgsWrapper, - callIdWrapper - }; - - v8::TryCatch tryCatch; - v8::Handle<v8::Value> resObj = function->Call(context->Global(), 3, args); - if (tryCatch.HasCaught()) { - v8::Local<v8::Message> message = tryCatch.Message(); - if (message.IsEmpty()) - *exception = "Unknown exception"; - else - *exception = WebCore::toWebCoreString(message->Get()); - return ""; - } - return WebCore::toWebCoreStringWithNullCheck(resObj); + m_webdevtoolsAgentClient->sendDebuggerOutput(command); } WebCore::Page* DebuggerAgentImpl::page() diff --git a/WebKit/chromium/src/DebuggerAgentImpl.h b/WebKit/chromium/src/DebuggerAgentImpl.h index 6eaf576..a8fcc4e 100644 --- a/WebKit/chromium/src/DebuggerAgentImpl.h +++ b/WebKit/chromium/src/DebuggerAgentImpl.h @@ -31,58 +31,31 @@ #ifndef DebuggerAgentImpl_h #define DebuggerAgentImpl_h -#include "DebuggerAgent.h" - -#include <v8.h> -#include <wtf/HashSet.h> -#include <wtf/Noncopyable.h> +#include <wtf/Forward.h> namespace WebCore { -class Document; -class Frame; -class Node; class Page; -class String; } namespace WebKit { +class WebDevToolsAgentClient; class WebDevToolsAgentImpl; class WebViewImpl; -class DebuggerAgentImpl : public DebuggerAgent { +class DebuggerAgentImpl { public: - // Creates utility context with injected js agent. - static void createUtilityContext(WebCore::Frame* frame, v8::Persistent<v8::Context>* context); - DebuggerAgentImpl(WebKit::WebViewImpl* webViewImpl, - DebuggerAgentDelegate* delegate, - WebDevToolsAgentImpl* webdevtoolsAgent); + WebDevToolsAgentImpl* webdevtoolsAgent, + WebDevToolsAgentClient* webdevtoolsAgentClient); virtual ~DebuggerAgentImpl(); - // DebuggerAgent implementation. - virtual void getContextId(); - virtual void processDebugCommands(); - - void debuggerOutput(const WebCore::String& out); + void debuggerOutput(const WTF::String& out); void setAutoContinueOnException(bool autoContinue) { m_autoContinueOnException = autoContinue; } bool autoContinueOnException() { return m_autoContinueOnException; } - // Executes function with the given name in the utility context. Passes node - // and json args as parameters. Note that the function called must be - // implemented in the inject_dispatch.js file. - WebCore::String executeUtilityFunction( - v8::Handle<v8::Context> context, - int callId, - const char* object, - const WebCore::String& functionName, - const WebCore::String& jsonArgs, - bool async, - WebCore::String* exception); - - WebCore::Page* page(); WebDevToolsAgentImpl* webdevtoolsAgent() { return m_webdevtoolsAgent; } @@ -90,8 +63,8 @@ public: private: WebKit::WebViewImpl* m_webViewImpl; - DebuggerAgentDelegate* m_delegate; WebDevToolsAgentImpl* m_webdevtoolsAgent; + WebDevToolsAgentClient* m_webdevtoolsAgentClient; bool m_autoContinueOnException; }; diff --git a/WebKit/chromium/src/DebuggerAgentManager.cpp b/WebKit/chromium/src/DebuggerAgentManager.cpp index faafaff..0860cb1 100644 --- a/WebKit/chromium/src/DebuggerAgentManager.cpp +++ b/WebKit/chromium/src/DebuggerAgentManager.cpp @@ -34,12 +34,14 @@ #include "DebuggerAgentImpl.h" #include "Frame.h" #include "PageGroupLoadDeferrer.h" +#include "ScriptDebugServer.h" #include "V8Proxy.h" #include "WebDevToolsAgentImpl.h" #include "WebFrameImpl.h" #include "WebViewImpl.h" #include <wtf/HashSet.h> #include <wtf/Noncopyable.h> +#include <wtf/text/StringConcatenate.h> namespace WebKit { @@ -49,9 +51,7 @@ bool DebuggerAgentManager::s_inHostDispatchHandler = false; DebuggerAgentManager::DeferrersMap DebuggerAgentManager::s_pageDeferrers; -bool DebuggerAgentManager::s_inUtilityContext = false; - -bool DebuggerAgentManager::s_debugBreakDelayed = false; +bool DebuggerAgentManager::s_exposeV8DebuggerProtocol = false; namespace { @@ -116,6 +116,8 @@ DebuggerAgentManager::AttachedAgentsMap* DebuggerAgentManager::s_attachedAgentsM void DebuggerAgentManager::debugAttach(DebuggerAgentImpl* debuggerAgent) { + if (!s_exposeV8DebuggerProtocol) + return; if (!s_attachedAgentsMap) { s_attachedAgentsMap = new AttachedAgentsMap(); v8::Debug::SetMessageHandler2(&DebuggerAgentManager::onV8DebugMessage); @@ -128,6 +130,8 @@ void DebuggerAgentManager::debugAttach(DebuggerAgentImpl* debuggerAgent) void DebuggerAgentManager::debugDetach(DebuggerAgentImpl* debuggerAgent) { + if (!s_exposeV8DebuggerProtocol) + return; if (!s_attachedAgentsMap) { ASSERT_NOT_REACHED(); return; @@ -150,10 +154,9 @@ void DebuggerAgentManager::debugDetach(DebuggerAgentImpl* debuggerAgent) } } else { // Remove all breakpoints set by the agent. - String clearBreakpointGroupCmd = String::format( + String clearBreakpointGroupCmd = makeString( "{\"seq\":1,\"type\":\"request\",\"command\":\"clearbreakpointgroup\"," - "\"arguments\":{\"groupId\":%d}}", - hostId); + "\"arguments\":{\"groupId\":", String::number(hostId), "}}"); sendCommandToV8(clearBreakpointGroupCmd, new CallerIdWrapper()); if (isOnBreakpoint) { @@ -169,7 +172,7 @@ void DebuggerAgentManager::onV8DebugMessage(const v8::Debug::Message& message) { v8::HandleScope scope; v8::String::Value value(message.GetJSON()); - String out(reinterpret_cast<const UChar*>(*value), value.length()); + WTF::String out(reinterpret_cast<const UChar*>(*value), value.length()); // If callerData is not 0 the message is a response to a debugger command. if (v8::Debug::ClientData* callerData = message.GetClientData()) { @@ -201,28 +204,20 @@ void DebuggerAgentManager::onV8DebugMessage(const v8::Debug::Message& message) return; } - if (s_inUtilityContext && message.GetEvent() == v8::Break) { - // This may happen when two tabs are being debugged in the same process. - // Suppose that first debugger is pauesed on an exception. It will run - // nested MessageLoop which may process Break request from the second - // debugger. - s_debugBreakDelayed = true; - } else { - // If the context is from one of the inpected tabs or injected extension - // scripts it must have hostId in the data field. - int hostId = WebCore::V8Proxy::contextDebugId(context); - if (hostId != -1) { - DebuggerAgentImpl* agent = debuggerAgentForHostId(hostId); - if (agent) { - if (agent->autoContinueOnException() - && message.GetEvent() == v8::Exception) { - sendContinueCommandToV8(); - return; - } - - agent->debuggerOutput(out); + // If the context is from one of the inpected tabs or injected extension + // scripts it must have hostId in the data field. + int hostId = WebCore::V8Proxy::contextDebugId(context); + if (hostId != -1) { + DebuggerAgentImpl* agent = debuggerAgentForHostId(hostId); + if (agent) { + if (agent->autoContinueOnException() + && message.GetEvent() == v8::Exception) { + sendContinueCommandToV8(); return; } + + agent->debuggerOutput(out); + return; } } @@ -235,13 +230,10 @@ void DebuggerAgentManager::onV8DebugMessage(const v8::Debug::Message& message) void DebuggerAgentManager::pauseScript() { - if (s_inUtilityContext) - s_debugBreakDelayed = true; - else - v8::Debug::DebugBreak(); + v8::Debug::DebugBreak(); } -void DebuggerAgentManager::executeDebuggerCommand(const String& command, int callerId) +void DebuggerAgentManager::executeDebuggerCommand(const WTF::String& command, int callerId) { sendCommandToV8(command, new CallerIdWrapper(callerId)); } @@ -251,6 +243,12 @@ void DebuggerAgentManager::setMessageLoopDispatchHandler(WebDevToolsAgent::Messa s_messageLoopDispatchHandler = handler; } +void DebuggerAgentManager::setExposeV8DebuggerProtocol(bool value) +{ + s_exposeV8DebuggerProtocol = value; + WebCore::ScriptDebugServer::shared().setEnabled(!s_exposeV8DebuggerProtocol); +} + void DebuggerAgentManager::setHostId(WebFrameImpl* webframe, int hostId) { ASSERT(hostId > 0); @@ -273,14 +271,14 @@ void DebuggerAgentManager::onNavigate() DebuggerAgentManager::sendContinueCommandToV8(); } -void DebuggerAgentManager::sendCommandToV8(const String& cmd, v8::Debug::ClientData* data) +void DebuggerAgentManager::sendCommandToV8(const WTF::String& cmd, v8::Debug::ClientData* data) { v8::Debug::SendCommand(reinterpret_cast<const uint16_t*>(cmd.characters()), cmd.length(), data); } void DebuggerAgentManager::sendContinueCommandToV8() { - String continueCmd("{\"seq\":1,\"type\":\"request\",\"command\":\"continue\"}"); + WTF::String continueCmd("{\"seq\":1,\"type\":\"request\",\"command\":\"continue\"}"); sendCommandToV8(continueCmd, new CallerIdWrapper()); } diff --git a/WebKit/chromium/src/DebuggerAgentManager.h b/WebKit/chromium/src/DebuggerAgentManager.h index a2e9030..66bd714 100644 --- a/WebKit/chromium/src/DebuggerAgentManager.h +++ b/WebKit/chromium/src/DebuggerAgentManager.h @@ -31,14 +31,17 @@ #ifndef DebuggerAgentManager_h #define DebuggerAgentManager_h +#include "WebCString.h" #include "WebDevToolsAgent.h" #include <v8-debug.h> +#include <wtf/Forward.h> #include <wtf/HashMap.h> #include <wtf/Noncopyable.h> +#include <wtf/Vector.h> namespace WebCore { +class Page; class PageGroupLoadDeferrer; -class String; } namespace WebKit { @@ -65,8 +68,9 @@ public: static void debugAttach(DebuggerAgentImpl* debuggerAgent); static void debugDetach(DebuggerAgentImpl* debuggerAgent); static void pauseScript(); - static void executeDebuggerCommand(const WebCore::String& command, int callerId); + static void executeDebuggerCommand(const WTF::String& command, int callerId); static void setMessageLoopDispatchHandler(WebDevToolsAgent::MessageLoopDispatchHandler handler); + static void setExposeV8DebuggerProtocol(bool); // Sets |hostId| as the frame context data. This id is used to filter scripts // related to the inspected page. @@ -76,30 +80,13 @@ public: static void onNavigate(); - class UtilityContextScope : public Noncopyable { - public: - UtilityContextScope() - { - ASSERT(!s_inUtilityContext); - s_inUtilityContext = true; - } - ~UtilityContextScope() - { - if (s_debugBreakDelayed) { - v8::Debug::DebugBreak(); - s_debugBreakDelayed = false; - } - s_inUtilityContext = false; - } - }; - private: DebuggerAgentManager(); ~DebuggerAgentManager(); static void debugHostDispatchHandler(); static void onV8DebugMessage(const v8::Debug::Message& message); - static void sendCommandToV8(const WebCore::String& cmd, + static void sendCommandToV8(const WTF::String& cmd, v8::Debug::ClientData* data); static void sendContinueCommandToV8(); @@ -114,8 +101,7 @@ private: typedef HashMap<WebViewImpl*, WebCore::PageGroupLoadDeferrer*> DeferrersMap; static DeferrersMap s_pageDeferrers; - static bool s_inUtilityContext; - static bool s_debugBreakDelayed; + static bool s_exposeV8DebuggerProtocol; }; } // namespace WebKit diff --git a/WebKit/chromium/src/DevToolsRPC.h b/WebKit/chromium/src/DevToolsRPC.h deleted file mode 100644 index 7176821..0000000 --- a/WebKit/chromium/src/DevToolsRPC.h +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -// DevTools RPC subsystem is a simple string serialization-based rpc -// implementation. The client is responsible for defining the Rpc-enabled -// interface in terms of its macros: -// -// #define MYAPI_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3) -// METHOD0(Method1) -// METHOD1(Method3, int) -// (snippet above should be multiline macro, add trailing backslashes) -// -// DEFINE_RPC_CLASS(MyApi, MYAPI_STRUCT) -// -// The snippet above will generate three classes: MyApi, MyApiStub and -// MyApiDispatch. -// -// 1. For each method defined in the marco MyApi will have a -// pure virtual function generated, so that MyApi would look like: -// -// class MyApi { -// private: -// MyApi() { } -// ~MyApi() { } -// virtual void method1() = 0; -// virtual void method2( -// int param1, -// const String& param2, -// const Value& param3) = 0; -// virtual void method3(int param1) = 0; -// }; -// -// 2. MyApiStub will implement MyApi interface and would serialize all calls -// into the string-based calls of the underlying transport: -// -// DevToolsRPC::Delegate* transport; -// myApi = new MyApiStub(transport); -// myApi->method1(); -// myApi->method3(2); -// -// 3. MyApiDelegate is capable of dispatching the calls and convert them to the -// calls to the underlying MyApi methods: -// -// MyApi* realObject; -// MyApiDispatch::dispatch(realObject, rawStringCallGeneratedByStub); -// -// will make corresponding calls to the real object. - -#ifndef DevToolsRPC_h -#define DevToolsRPC_h - -#include "PlatformString.h" -#include "Vector.h" -#include "WebDevToolsMessageData.h" - -#include <wtf/Noncopyable.h> - -namespace WebCore { -class String; -} - -using WebCore::String; -using WTF::Vector; - -namespace WebKit { - -/////////////////////////////////////////////////////// -// RPC dispatch macro - -template<typename T> -struct RpcTypeTrait { - typedef T ApiType; -}; - -template<> -struct RpcTypeTrait<bool> { - typedef bool ApiType; - static bool parse(const WebCore::String& t) - { - return t == "true"; - } - static WebCore::String toString(bool b) - { - return b ? "true" : "false"; - } -}; - -template<> -struct RpcTypeTrait<int> { - typedef int ApiType; - static int parse(const WebCore::String& t) - { - bool success; - int i = t.toIntStrict(&success); - ASSERT(success); - return i; - } - static WebCore::String toString(int i) - { - return WebCore::String::number(i); - } -}; - -template<> -struct RpcTypeTrait<String> { - typedef const String& ApiType; - static String parse(const WebCore::String& t) - { - return t; - } - static WebCore::String toString(const String& t) - { - return t; - } -}; - -/////////////////////////////////////////////////////// -// RPC Api method declarations - -#define TOOLS_RPC_API_METHOD0(Method) \ - virtual void Method() = 0; - -#define TOOLS_RPC_API_METHOD1(Method, T1) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1) = 0; - -#define TOOLS_RPC_API_METHOD2(Method, T1, T2) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ - RpcTypeTrait<T2>::ApiType t2) = 0; - -#define TOOLS_RPC_API_METHOD3(Method, T1, T2, T3) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ - RpcTypeTrait<T2>::ApiType t2, \ - RpcTypeTrait<T3>::ApiType t3) = 0; - -#define TOOLS_RPC_API_METHOD4(Method, T1, T2, T3, T4) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ - RpcTypeTrait<T2>::ApiType t2, \ - RpcTypeTrait<T3>::ApiType t3, \ - RpcTypeTrait<T4>::ApiType t4) = 0; - -#define TOOLS_RPC_API_METHOD5(Method, T1, T2, T3, T4, T5) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ - RpcTypeTrait<T2>::ApiType t2, \ - RpcTypeTrait<T3>::ApiType t3, \ - RpcTypeTrait<T4>::ApiType t4, \ - RpcTypeTrait<T5>::ApiType t5) = 0; - -/////////////////////////////////////////////////////// -// RPC stub method implementations - -#define TOOLS_RPC_STUB_METHOD0(Method) \ - virtual void Method() { \ - Vector<String> args; \ - this->sendRpcMessage(m_className, #Method, args); \ - } - -#define TOOLS_RPC_STUB_METHOD1(Method, T1) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1) { \ - Vector<String> args(1); \ - args[0] = RpcTypeTrait<T1>::toString(t1); \ - this->sendRpcMessage(m_className, #Method, args); \ - } - -#define TOOLS_RPC_STUB_METHOD2(Method, T1, T2) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ - RpcTypeTrait<T2>::ApiType t2) { \ - Vector<String> args(2); \ - args[0] = RpcTypeTrait<T1>::toString(t1); \ - args[1] = RpcTypeTrait<T2>::toString(t2); \ - this->sendRpcMessage(m_className, #Method, args); \ - } - -#define TOOLS_RPC_STUB_METHOD3(Method, T1, T2, T3) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ - RpcTypeTrait<T2>::ApiType t2, \ - RpcTypeTrait<T3>::ApiType t3) { \ - Vector<String> args(3); \ - args[0] = RpcTypeTrait<T1>::toString(t1); \ - args[1] = RpcTypeTrait<T2>::toString(t2); \ - args[2] = RpcTypeTrait<T3>::toString(t3); \ - this->sendRpcMessage(m_className, #Method, args); \ - } - -#define TOOLS_RPC_STUB_METHOD4(Method, T1, T2, T3, T4) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ - RpcTypeTrait<T2>::ApiType t2, \ - RpcTypeTrait<T3>::ApiType t3, \ - RpcTypeTrait<T4>::ApiType t4) { \ - Vector<String> args(4); \ - args[0] = RpcTypeTrait<T1>::toString(t1); \ - args[1] = RpcTypeTrait<T2>::toString(t2); \ - args[2] = RpcTypeTrait<T3>::toString(t3); \ - args[3] = RpcTypeTrait<T4>::toString(t4); \ - this->sendRpcMessage(m_className, #Method, args); \ - } - -#define TOOLS_RPC_STUB_METHOD5(Method, T1, T2, T3, T4, T5) \ - virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ - RpcTypeTrait<T2>::ApiType t2, \ - RpcTypeTrait<T3>::ApiType t3, \ - RpcTypeTrait<T4>::ApiType t4, \ - RpcTypeTrait<T5>::ApiType t5) { \ - Vector<String> args(5); \ - args[0] = RpcTypeTrait<T1>::toString(t1); \ - args[1] = RpcTypeTrait<T2>::toString(t2); \ - args[2] = RpcTypeTrait<T3>::toString(t3); \ - args[3] = RpcTypeTrait<T4>::toString(t4); \ - args[4] = RpcTypeTrait<T5>::toString(t5); \ - this->sendRpcMessage(m_className, #Method, args); \ - } - -/////////////////////////////////////////////////////// -// RPC dispatch method implementations - -#define TOOLS_RPC_DISPATCH0(Method) \ -if (methodName == #Method) { \ - delegate->Method(); \ - return true; \ -} - -#define TOOLS_RPC_DISPATCH1(Method, T1) \ -if (methodName == #Method) { \ - delegate->Method(RpcTypeTrait<T1>::parse(args[0])); \ - return true; \ -} - -#define TOOLS_RPC_DISPATCH2(Method, T1, T2) \ -if (methodName == #Method) { \ - delegate->Method( \ - RpcTypeTrait<T1>::parse(args[0]), \ - RpcTypeTrait<T2>::parse(args[1]) \ - ); \ - return true; \ -} - -#define TOOLS_RPC_DISPATCH3(Method, T1, T2, T3) \ -if (methodName == #Method) { \ - delegate->Method( \ - RpcTypeTrait<T1>::parse(args[0]), \ - RpcTypeTrait<T2>::parse(args[1]), \ - RpcTypeTrait<T3>::parse(args[2]) \ - ); \ - return true; \ -} - -#define TOOLS_RPC_DISPATCH4(Method, T1, T2, T3, T4) \ -if (methodName == #Method) { \ - delegate->Method( \ - RpcTypeTrait<T1>::parse(args[0]), \ - RpcTypeTrait<T2>::parse(args[1]), \ - RpcTypeTrait<T3>::parse(args[2]), \ - RpcTypeTrait<T4>::parse(args[3]) \ - ); \ - return true; \ -} - -#define TOOLS_RPC_DISPATCH5(Method, T1, T2, T3, T4, T5) \ -if (methodName == #Method) { \ - delegate->Method( \ - RpcTypeTrait<T1>::parse(args[0]), \ - RpcTypeTrait<T2>::parse(args[1]), \ - RpcTypeTrait<T3>::parse(args[2]), \ - RpcTypeTrait<T4>::parse(args[3]), \ - RpcTypeTrait<T5>::parse(args[4]) \ - ); \ - return true; \ -} - -#define TOOLS_END_RPC_DISPATCH() \ -} - -// This macro defines three classes: Class with the Api, ClassStub that is -// serializing method calls and ClassDispatch that is capable of dispatching -// the serialized message into its delegate. -#define DEFINE_RPC_CLASS(Class, STRUCT) \ -class Class : public Noncopyable {\ -public: \ - Class() \ - { \ - m_className = #Class; \ - } \ - virtual ~Class() { } \ - \ - STRUCT( \ - TOOLS_RPC_API_METHOD0, \ - TOOLS_RPC_API_METHOD1, \ - TOOLS_RPC_API_METHOD2, \ - TOOLS_RPC_API_METHOD3, \ - TOOLS_RPC_API_METHOD4, \ - TOOLS_RPC_API_METHOD5) \ - WebCore::String m_className; \ -}; \ -\ -class Class##Stub \ - : public Class \ - , public DevToolsRPC { \ -public: \ - explicit Class##Stub(Delegate* delegate) : DevToolsRPC(delegate) { } \ - virtual ~Class##Stub() { } \ - typedef Class CLASS; \ - STRUCT( \ - TOOLS_RPC_STUB_METHOD0, \ - TOOLS_RPC_STUB_METHOD1, \ - TOOLS_RPC_STUB_METHOD2, \ - TOOLS_RPC_STUB_METHOD3, \ - TOOLS_RPC_STUB_METHOD4, \ - TOOLS_RPC_STUB_METHOD5) \ -}; \ -\ -class Class##Dispatch : public Noncopyable { \ -public: \ - Class##Dispatch() { } \ - virtual ~Class##Dispatch() { } \ - \ - static bool dispatch(Class* delegate, \ - const WebKit::WebDevToolsMessageData& data) { \ - String className = data.className; \ - if (className != #Class) \ - return false; \ - String methodName = data.methodName; \ - Vector<String> args; \ - for (size_t i = 0; i < data.arguments.size(); i++) \ - args.append(data.arguments[i]); \ - typedef Class CLASS; \ - STRUCT( \ - TOOLS_RPC_DISPATCH0, \ - TOOLS_RPC_DISPATCH1, \ - TOOLS_RPC_DISPATCH2, \ - TOOLS_RPC_DISPATCH3, \ - TOOLS_RPC_DISPATCH4, \ - TOOLS_RPC_DISPATCH5) \ - return false; \ - } \ -}; - -/////////////////////////////////////////////////////// -// RPC base class -class DevToolsRPC { -public: - class Delegate { - public: - Delegate() { } - virtual ~Delegate() { } - virtual void sendRpcMessage(const WebKit::WebDevToolsMessageData& data) = 0; - }; - - explicit DevToolsRPC(Delegate* delegate) : m_delegate(delegate) { } - virtual ~DevToolsRPC() { }; - -protected: - void sendRpcMessage(const String& className, - const String& methodName, - const Vector<String>& args) { - WebKit::WebVector<WebKit::WebString> webArgs(args.size()); - for (size_t i = 0; i < args.size(); i++) - webArgs[i] = args[i]; - WebKit::WebDevToolsMessageData data; - data.className = className; - data.methodName = methodName; - data.arguments.swap(webArgs); - this->m_delegate->sendRpcMessage(data); - } - - Delegate* m_delegate; -}; - -} // namespace WebKit - -#endif diff --git a/WebKit/chromium/src/DevToolsRPCJS.h b/WebKit/chromium/src/DevToolsRPCJS.h deleted file mode 100644 index 8ae279f..0000000 --- a/WebKit/chromium/src/DevToolsRPCJS.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -// Additional set of macros for the JS RPC. - -#ifndef DevToolsRPCJS_h -#define DevToolsRPCJS_h - -// Do not remove this one although it is not used. -#include "BoundObject.h" -#include "DevToolsRPC.h" -#include "WebFrame.h" -#include <wtf/Noncopyable.h> -#include <wtf/OwnPtr.h> - -namespace WebKit { - -/////////////////////////////////////////////////////// -// JS RPC binds and stubs - -#define TOOLS_RPC_JS_BIND_METHOD0(Method) \ - boundObj.addProtoFunction(#Method, OCLASS::js##Method); - -#define TOOLS_RPC_JS_BIND_METHOD1(Method, T1) \ - boundObj.addProtoFunction(#Method, OCLASS::js##Method); - -#define TOOLS_RPC_JS_BIND_METHOD2(Method, T1, T2) \ - boundObj.addProtoFunction(#Method, OCLASS::js##Method); - -#define TOOLS_RPC_JS_BIND_METHOD3(Method, T1, T2, T3) \ - boundObj.addProtoFunction(#Method, OCLASS::js##Method); - -#define TOOLS_RPC_JS_BIND_METHOD4(Method, T1, T2, T3, T4) \ - boundObj.addProtoFunction(#Method, OCLASS::js##Method); - -#define TOOLS_RPC_JS_BIND_METHOD5(Method, T1, T2, T3, T4, T5) \ - boundObj.addProtoFunction(#Method, OCLASS::js##Method); - -#define TOOLS_RPC_JS_STUB_METHOD0(Method) \ - static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \ - sendRpcMessageFromJS(#Method, args, 0); \ - return v8::Undefined(); \ - } - -#define TOOLS_RPC_JS_STUB_METHOD1(Method, T1) \ - static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \ - sendRpcMessageFromJS(#Method, args, 1); \ - return v8::Undefined(); \ - } - -#define TOOLS_RPC_JS_STUB_METHOD2(Method, T1, T2) \ - static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \ - sendRpcMessageFromJS(#Method, args, 2); \ - return v8::Undefined(); \ - } - -#define TOOLS_RPC_JS_STUB_METHOD3(Method, T1, T2, T3) \ - static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \ - sendRpcMessageFromJS(#Method, args, 3); \ - return v8::Undefined(); \ - } - -#define TOOLS_RPC_JS_STUB_METHOD4(Method, T1, T2, T3, T4) \ - static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \ - sendRpcMessageFromJS(#Method, args, 4); \ - return v8::Undefined(); \ - } - -#define TOOLS_RPC_JS_STUB_METHOD5(Method, T1, T2, T3, T4, T5) \ - static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \ - sendRpcMessageFromJS(#Method, args, 5); \ - return v8::Undefined(); \ - } - -/////////////////////////////////////////////////////// -// JS RPC main obj macro - -#define DEFINE_RPC_JS_BOUND_OBJ(Class, STRUCT, DClass, DELEGATE_STRUCT) \ -class JS##Class##BoundObj : public Class##Stub { \ -public: \ - JS##Class##BoundObj(Delegate* rpcDelegate, \ - v8::Handle<v8::Context> context, \ - const char* classname) \ - : Class##Stub(rpcDelegate) { \ - BoundObject boundObj(context, this, classname); \ - STRUCT( \ - TOOLS_RPC_JS_BIND_METHOD0, \ - TOOLS_RPC_JS_BIND_METHOD1, \ - TOOLS_RPC_JS_BIND_METHOD2, \ - TOOLS_RPC_JS_BIND_METHOD3, \ - TOOLS_RPC_JS_BIND_METHOD4, \ - TOOLS_RPC_JS_BIND_METHOD5) \ - boundObj.build(); \ - } \ - virtual ~JS##Class##BoundObj() { } \ - typedef JS##Class##BoundObj OCLASS; \ - STRUCT( \ - TOOLS_RPC_JS_STUB_METHOD0, \ - TOOLS_RPC_JS_STUB_METHOD1, \ - TOOLS_RPC_JS_STUB_METHOD2, \ - TOOLS_RPC_JS_STUB_METHOD3, \ - TOOLS_RPC_JS_STUB_METHOD4, \ - TOOLS_RPC_JS_STUB_METHOD5) \ -private: \ - static void sendRpcMessageFromJS(const char* method, \ - const v8::Arguments& jsArguments, \ - size_t argsCount) \ - { \ - Vector<String> args(argsCount); \ - for (size_t i = 0; i < argsCount; i++) \ - args[i] = WebCore::toWebCoreStringWithNullCheck(jsArguments[i]); \ - void* selfPtr = v8::External::Cast(*jsArguments.Data())->Value(); \ - JS##Class##BoundObj* self = static_cast<JS##Class##BoundObj*>(selfPtr); \ - self->sendRpcMessage(#Class, method, args); \ - } \ -}; - -} // namespace WebKit - -#endif diff --git a/WebKit/chromium/src/DeviceOrientationClientProxy.cpp b/WebKit/chromium/src/DeviceOrientationClientProxy.cpp new file mode 100644 index 0000000..29b43ba --- /dev/null +++ b/WebKit/chromium/src/DeviceOrientationClientProxy.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "DeviceOrientationClientProxy.h" + +#include "DeviceOrientation.h" +#include "WebDeviceOrientation.h" +#include "WebDeviceOrientationController.h" +#include <wtf/OwnPtr.h> +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { +class DeviceOrientationController; +} + +namespace WebKit { + +void DeviceOrientationClientProxy::setController(WebCore::DeviceOrientationController* c) +{ + if (!m_client) // FIXME: Get rid of these null checks once device orientation is enabled by default. + return; + m_client->setController(new WebDeviceOrientationController(c)); +} + +void DeviceOrientationClientProxy::startUpdating() +{ + if (!m_client) + return; + m_client->startUpdating(); +} + +void DeviceOrientationClientProxy::stopUpdating() +{ + if (!m_client) + return; + m_client->stopUpdating(); +} + +WebCore::DeviceOrientation* DeviceOrientationClientProxy::lastOrientation() const +{ + if (!m_client) + return 0; + + // Cache the DeviceOrientation pointer so its reference count does not drop to zero upon return. + m_lastOrientation = m_client->lastOrientation(); + + return m_lastOrientation.get(); +} + +void DeviceOrientationClientProxy::deviceOrientationControllerDestroyed() +{ + // Our lifetime is bound to the WebViewImpl. +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/DeviceOrientationClientProxy.h b/WebKit/chromium/src/DeviceOrientationClientProxy.h new file mode 100644 index 0000000..e90d77f --- /dev/null +++ b/WebKit/chromium/src/DeviceOrientationClientProxy.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef DeviceOrientationClientProxy_h +#define DeviceOrientationClientProxy_h + +#include "DeviceOrientation.h" +#include "DeviceOrientationClient.h" +#include "WebDeviceOrientationClient.h" +#include <wtf/RefPtr.h> + +namespace WebCore { +class DeviceOrientationController; +} + +namespace WebKit { + +class DeviceOrientationClientProxy : public WebCore::DeviceOrientationClient { +public: + DeviceOrientationClientProxy(WebDeviceOrientationClient* client) + : m_client(client) + { + } + + void setController(WebCore::DeviceOrientationController*); + void startUpdating(); + void stopUpdating(); + WebCore::DeviceOrientation* lastOrientation() const; + virtual void deviceOrientationControllerDestroyed(); + +private: + WebDeviceOrientationClient* m_client; + mutable RefPtr<WebCore::DeviceOrientation> m_lastOrientation; +}; + +} // namespace WebKit + +#endif // DeviceOrientationClientProxy_h diff --git a/WebKit/chromium/src/DragClientImpl.cpp b/WebKit/chromium/src/DragClientImpl.cpp index 671e7ca..9874401 100644 --- a/WebKit/chromium/src/DragClientImpl.cpp +++ b/WebKit/chromium/src/DragClientImpl.cpp @@ -30,11 +30,14 @@ #include "config.h" #include "DragClientImpl.h" - +#include "DragImageRef.h" #include "ChromiumDataObject.h" #include "ClipboardChromium.h" #include "Frame.h" +#include "NativeImageSkia.h" +#include "WebCommon.h" #include "WebDragData.h" +#include "WebImage.h" #include "WebViewClient.h" #include "WebViewImpl.h" @@ -81,8 +84,16 @@ void DragClientImpl::startDrag(DragImageRef dragImage, DragOperation dragOperationMask = clipboard->sourceOperation(); + IntSize offsetSize(eventPos - dragImageOrigin); + WebPoint offsetPoint(offsetSize.width(), offsetSize.height()); m_webView->startDragging( - eventPos, dragData, static_cast<WebDragOperationsMask>(dragOperationMask)); + dragData, static_cast<WebDragOperationsMask>(dragOperationMask), +#if WEBKIT_USING_SKIA + dragImage ? WebImage(*dragImage) : WebImage(), +#else + dragImage ? WebImage(dragImage) : WebImage(), +#endif + offsetPoint); } DragImageRef DragClientImpl::createDragImageForLink(KURL&, const String& label, Frame*) diff --git a/WebKit/chromium/src/DragClientImpl.h b/WebKit/chromium/src/DragClientImpl.h index fc4c608..dac7acd 100644 --- a/WebKit/chromium/src/DragClientImpl.h +++ b/WebKit/chromium/src/DragClientImpl.h @@ -63,7 +63,7 @@ public: WebCore::Frame* frame, bool isLinkDrag = false); virtual WebCore::DragImageRef createDragImageForLink( - WebCore::KURL&, const WebCore::String& label, WebCore::Frame*); + WebCore::KURL&, const WTF::String& label, WebCore::Frame*); virtual void dragControllerDestroyed(); private: diff --git a/WebKit/chromium/src/DragScrollTimer.cpp b/WebKit/chromium/src/DragScrollTimer.cpp new file mode 100644 index 0000000..83b81b7 --- /dev/null +++ b/WebKit/chromium/src/DragScrollTimer.cpp @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "DragScrollTimer.h" + +#include "FrameView.h" + +using namespace WebCore; + +namespace WebKit { + +// Computes the distance from a point outside a rect to the nearest edge of the rect. +static IntSize distanceToRect(const IntPoint& point, const IntRect& rect) +{ + int dx = 0, dy = 0; + if (point.x() < rect.x()) + dx = point.x() - rect.x(); + else if (rect.right() < point.x()) + dx = point.x() - rect.right(); + if (point.y() < rect.y()) + dy = point.y() - rect.y(); + else if (rect.bottom() < point.y()) + dy = point.y() - rect.bottom(); + return IntSize(dx, dy); +} + +DragScrollTimer::DragScrollTimer() + : m_timer(this, &DragScrollTimer::fired) + , m_view(0) + , m_scrolling(false) +{ +} + +DragScrollTimer::~DragScrollTimer() +{ + // We do this for detecting dead object earlier + stop(); +} + +void DragScrollTimer::stop() +{ + m_timer.stop(); + m_view = 0; + m_scrolling = false; +} + +void DragScrollTimer::scroll() +{ + m_view->scrollBy(m_lastDistance); + m_scrolling = true; +} + +void DragScrollTimer::update() +{ + if (shouldScroll()) + scroll(); + else + stop(); +} + +void DragScrollTimer::triggerScroll(FrameView* view, const WebPoint& location) +{ + if (!view) + return; + + // Approximates Safari + static const double scrollStartDelay = 0.2; + + m_view = view; + m_lastDistance = scrollDistanceFor(view, location); + + if (m_scrolling) + update(); + else if (shouldScroll() && !m_timer.isActive()) + m_timer.startOneShot(scrollStartDelay); +} + +IntSize DragScrollTimer::scrollDistanceFor(FrameView* view, const WebPoint& location) const +{ + static const int scrollMargin = 30; + + IntRect bounds(0, 0, view->visibleWidth(), view->visibleHeight()); + if (!bounds.contains(location)) + return IntSize(0, 0); // The location is outside the border belt. + + bounds.setY(bounds.y() + scrollMargin); + bounds.setHeight(bounds.height() - scrollMargin * 2); + bounds.setX(bounds.x() + scrollMargin); + bounds.setWidth(bounds.width() - scrollMargin * 2); + + if (bounds.contains(location)) + return IntSize(0, 0); // The location is inside the border belt. + + // The location is over the border belt. + return distanceToRect(location, bounds); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/DragScrollTimer.h b/WebKit/chromium/src/DragScrollTimer.h new file mode 100644 index 0000000..a4090e0 --- /dev/null +++ b/WebKit/chromium/src/DragScrollTimer.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef DragScrollTimer_h +#define DragScrollTimer_h + +#include "IntSize.h" +#include "Timer.h" +#include "WebPoint.h" + +namespace WebCore { class FrameView; } + +namespace WebKit { + +// +// Encapsulating a timer and associated state management for +// scroll-on-drag behaviour. +// +class DragScrollTimer { +public: + DragScrollTimer(); + ~DragScrollTimer(); + + void fired(WebCore::Timer<DragScrollTimer>*) { update(); } + void triggerScroll(WebCore::FrameView*, const WebPoint&); + void stop(); + +private: + void scroll(); + void update(); + WebCore::IntSize scrollDistanceFor(WebCore::FrameView*, const WebPoint&) const; + bool shouldScroll() const { return !m_lastDistance.isZero(); } + + WebCore::Timer<DragScrollTimer> m_timer; + WebCore::FrameView* m_view; + WebCore::IntSize m_lastDistance; + bool m_scrolling; +}; + +} // namespace WebKit + +#endif diff --git a/WebKit/chromium/src/EditorClientImpl.cpp b/WebKit/chromium/src/EditorClientImpl.cpp index d5bddc5..bc1d206 100644 --- a/WebKit/chromium/src/EditorClientImpl.cpp +++ b/WebKit/chromium/src/EditorClientImpl.cpp @@ -43,9 +43,11 @@ #include "DOMUtilitiesPrivate.h" #include "WebEditingAction.h" +#include "WebElement.h" #include "WebFrameImpl.h" #include "WebKit.h" #include "WebInputElement.h" +#include "WebInputEventConversion.h" #include "WebNode.h" #include "WebPasswordAutocompleteListener.h" #include "WebRange.h" @@ -90,7 +92,7 @@ bool EditorClientImpl::shouldShowDeleteInterface(HTMLElement* elem) // Normally, we don't care to show WebCore's deletion UI, so we only enable // it if in testing mode and the test specifically requests it by using this // magic class name. - return WebKit::layoutTestMode() + return layoutTestMode() && elem->getAttribute(HTMLNames::classAttr) == "needsDeletionUI"; } @@ -122,7 +124,7 @@ bool EditorClientImpl::shouldSpellcheckByDefault() const Editor* editor = frame->editor(); if (!editor) return false; - if (editor->spellCheckingEnabledInFocusedNode()) + if (editor->isSpellCheckingEnabledInFocusedNode()) return true; const Document* document = frame->document(); if (!document) @@ -413,8 +415,10 @@ static const KeyDownEntry keyDownEntries[] = { { VKEY_DOWN, 0, "MoveDown" }, { VKEY_DOWN, ShiftKey, "MoveDownAndModifySelection" }, { VKEY_NEXT, ShiftKey, "MovePageDownAndModifySelection" }, +#if !OS(DARWIN) { VKEY_PRIOR, 0, "MovePageUp" }, { VKEY_NEXT, 0, "MovePageDown" }, +#endif { VKEY_HOME, 0, "MoveToBeginningOfLine" }, { VKEY_HOME, ShiftKey, "MoveToBeginningOfLineAndModifySelection" }, @@ -422,6 +426,8 @@ static const KeyDownEntry keyDownEntries[] = { { VKEY_LEFT, CommandKey, "MoveToBeginningOfLine" }, { VKEY_LEFT, CommandKey | ShiftKey, "MoveToBeginningOfLineAndModifySelection" }, + { VKEY_PRIOR, OptionKey, "MovePageUp" }, + { VKEY_NEXT, OptionKey, "MovePageDown" }, #endif #if OS(DARWIN) { VKEY_UP, CommandKey, "MoveToBeginningOfDocument" }, @@ -640,12 +646,19 @@ void EditorClientImpl::handleInputMethodKeydown(KeyboardEvent* keyEvent) // We handle IME within chrome. } -void EditorClientImpl::textFieldDidBeginEditing(Element*) +void EditorClientImpl::textFieldDidBeginEditing(Element* element) { + HTMLInputElement* inputElement = toHTMLInputElement(element); + if (m_webView->client() && inputElement) + m_webView->client()->textFieldDidBeginEditing(WebInputElement(inputElement)); } void EditorClientImpl::textFieldDidEndEditing(Element* element) { + HTMLInputElement* inputElement = toHTMLInputElement(element); + if (m_webView->client() && inputElement) + m_webView->client()->textFieldDidEndEditing(WebInputElement(inputElement)); + // Notification that focus was lost. Be careful with this, it's also sent // when the page is being closed. @@ -654,13 +667,12 @@ void EditorClientImpl::textFieldDidEndEditing(Element* element) m_autofillTimer.stop(); // Hide any showing popup. - m_webView->hideSuggestionsPopup(); + m_webView->hideAutoFillPopup(); if (!m_webView->client()) return; // The page is getting closed, don't fill the password. // Notify any password-listener of the focus change. - HTMLInputElement* inputElement = WebKit::toHTMLInputElement(element); if (!inputElement) return; @@ -678,15 +690,18 @@ void EditorClientImpl::textFieldDidEndEditing(Element* element) void EditorClientImpl::textDidChangeInTextField(Element* element) { ASSERT(element->hasLocalName(HTMLNames::inputTag)); + HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(element); + if (m_webView->client()) + m_webView->client()->textFieldDidChange(WebInputElement(inputElement)); + // Note that we only show the autofill popup in this case if the caret is at // the end. This matches FireFox and Safari but not IE. - autofill(static_cast<HTMLInputElement*>(element), false, false, - true); + autofill(inputElement, false, false, true); } bool EditorClientImpl::showFormAutofillForNode(Node* node) { - HTMLInputElement* inputElement = WebKit::toHTMLInputElement(node); + HTMLInputElement* inputElement = toHTMLInputElement(node); if (inputElement) return autofill(inputElement, true, true, false); return false; @@ -701,10 +716,12 @@ bool EditorClientImpl::autofill(HTMLInputElement* inputElement, m_autofillArgs.clear(); m_autofillTimer.stop(); + // FIXME: Remove the extraneous isEnabledFormControl call below. // Let's try to trigger autofill for that field, if applicable. if (!inputElement->isEnabledFormControl() || !inputElement->isTextField() - || inputElement->isPasswordField() - || !inputElement->autoComplete()) + || inputElement->isPasswordField() || !inputElement->autoComplete() + || !inputElement->isEnabledFormControl() + || inputElement->isReadOnlyFormControl()) return false; WebString name = WebInputElement(inputElement).nameForAutofill(); @@ -748,7 +765,7 @@ void EditorClientImpl::doAutofill(Timer<EditorClientImpl>* timer) && inputElement->selectionEnd() == static_cast<int>(value.length()); if ((!args->autofillOnEmptyValue && value.isEmpty()) || !isCaretAtEnd) { - m_webView->hideSuggestionsPopup(); + m_webView->hideAutoFillPopup(); return; } @@ -784,22 +801,27 @@ void EditorClientImpl::cancelPendingAutofill() m_autofillTimer.stop(); } -void EditorClientImpl::onAutofillSuggestionAccepted(HTMLInputElement* textField) +void EditorClientImpl::onAutocompleteSuggestionAccepted(HTMLInputElement* textField) { + if (m_webView->client()) + m_webView->client()->didAcceptAutocompleteSuggestion(WebInputElement(textField)); + WebFrameImpl* webframe = WebFrameImpl::fromFrame(textField->document()->frame()); if (!webframe) return; - WebPasswordAutocompleteListener* listener = webframe->getPasswordListener(textField); - // Password listeners need to autocomplete other fields that depend on the - // input element with autofill suggestions. - if (listener) - listener->performInlineAutocomplete(textField->value(), false, false); + webframe->notifiyPasswordListenerOfAutocomplete(WebInputElement(textField)); } bool EditorClientImpl::doTextFieldCommandFromEvent(Element* element, KeyboardEvent* event) { + HTMLInputElement* inputElement = toHTMLInputElement(element); + if (m_webView->client() && inputElement) { + m_webView->client()->textFieldDidReceiveKeyDown(WebInputElement(inputElement), + WebKeyboardEventBuilder(*event)); + } + // Remember if backspace was pressed for the autofill. It is not clear how to // find if backspace was pressed from textFieldDidBeginEditing and // textDidChangeInTextField as when these methods are called the value of the @@ -913,10 +935,14 @@ void EditorClientImpl::getGuessesForWord(const String&, notImplemented(); } -void EditorClientImpl::setInputMethodState(bool enabled) +void EditorClientImpl::willSetInputMethodState() { if (m_webView->client()) - m_webView->client()->setInputMethodEnabled(enabled); + m_webView->client()->resetInputMethod(); +} + +void EditorClientImpl::setInputMethodState(bool) +{ } } // namesace WebKit diff --git a/WebKit/chromium/src/EditorClientImpl.h b/WebKit/chromium/src/EditorClientImpl.h index fd08b4d..b05a592 100644 --- a/WebKit/chromium/src/EditorClientImpl.h +++ b/WebKit/chromium/src/EditorClientImpl.h @@ -61,7 +61,7 @@ public: virtual bool shouldBeginEditing(WebCore::Range*); virtual bool shouldEndEditing(WebCore::Range*); virtual bool shouldInsertNode(WebCore::Node*, WebCore::Range*, WebCore::EditorInsertAction); - virtual bool shouldInsertText(const WebCore::String&, WebCore::Range*, WebCore::EditorInsertAction); + virtual bool shouldInsertText(const WTF::String&, WebCore::Range*, WebCore::EditorInsertAction); virtual bool shouldDeleteRange(WebCore::Range*); virtual bool shouldChangeSelectedRange(WebCore::Range* fromRange, WebCore::Range* toRange, @@ -92,8 +92,8 @@ public: virtual bool doTextFieldCommandFromEvent(WebCore::Element*, WebCore::KeyboardEvent*); virtual void textWillBeDeletedInTextField(WebCore::Element*); virtual void textDidChangeInTextArea(WebCore::Element*); - virtual void ignoreWordInSpellDocument(const WebCore::String&); - virtual void learnWord(const WebCore::String&); + virtual void ignoreWordInSpellDocument(const WTF::String&); + virtual void learnWord(const WTF::String&); virtual void checkSpellingOfString(const UChar*, int length, int* misspellingLocation, int* misspellingLength); @@ -101,13 +101,14 @@ public: WTF::Vector<WebCore::GrammarDetail>&, int* badGrammarLocation, int* badGrammarLength); - virtual WebCore::String getAutoCorrectSuggestionForMisspelledWord(const WebCore::String&); - virtual void updateSpellingUIWithGrammarString(const WebCore::String&, const WebCore::GrammarDetail&); - virtual void updateSpellingUIWithMisspelledWord(const WebCore::String&); + virtual WTF::String getAutoCorrectSuggestionForMisspelledWord(const WTF::String&); + virtual void updateSpellingUIWithGrammarString(const WTF::String&, const WebCore::GrammarDetail&); + virtual void updateSpellingUIWithMisspelledWord(const WTF::String&); virtual void showSpellingUI(bool show); virtual bool spellingUIIsShowing(); - virtual void getGuessesForWord(const WebCore::String& word, - WTF::Vector<WebCore::String>& guesses); + virtual void getGuessesForWord(const WTF::String& word, + WTF::Vector<WTF::String>& guesses); + virtual void willSetInputMethodState(); virtual void setInputMethodState(bool enabled); // Shows the form autofill popup for |node| if it is an HTMLInputElement and @@ -118,10 +119,10 @@ public: virtual bool showFormAutofillForNode(WebCore::Node*); // Notification that the text changed due to acceptance of a suggestion - // provided by an autofill popup. Having a separate callback in this case - // is a simple way to break the cycle that would otherwise occur if + // provided by an Autocomplete popup. Having a separate callback in this + // case is a simple way to break the cycle that would otherwise occur if // textDidChangeInTextField was called. - virtual void onAutofillSuggestionAccepted(WebCore::HTMLInputElement*); + virtual void onAutocompleteSuggestionAccepted(WebCore::HTMLInputElement*); private: void modifySelection(WebCore::Frame*, WebCore::KeyboardEvent*); diff --git a/WebKit/chromium/src/EventListenerWrapper.cpp b/WebKit/chromium/src/EventListenerWrapper.cpp index f2d2979..6360932 100644 --- a/WebKit/chromium/src/EventListenerWrapper.cpp +++ b/WebKit/chromium/src/EventListenerWrapper.cpp @@ -1,72 +1,72 @@ -/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 THE COPYRIGHT
- * OWNER 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 "config.h"
-#include "EventListenerWrapper.h"
-
-#include "Event.h"
-#include "EventListener.h"
-
-#include "WebEvent.h"
-#include "WebEventListener.h"
-
-namespace WebKit {
-
-EventListenerWrapper::EventListenerWrapper(WebEventListener* webEventListener)
- : EventListener(EventListener::JSEventListenerType)
- , m_webEventListener(webEventListener)
-{
-}
-
-EventListenerWrapper::~EventListenerWrapper()
-{
- if (m_webEventListener)
- m_webEventListener->notifyEventListenerDeleted(this);
-}
-
-bool EventListenerWrapper::operator==(const EventListener& listener)
-{
- return this == &listener;
-}
-
-void EventListenerWrapper::handleEvent(ScriptExecutionContext* context, Event* event)
-{
- if (!m_webEventListener)
- return;
- WebEvent webEvent(event);
- m_webEventListener->handleEvent(webEvent);
-}
-
-void EventListenerWrapper::webEventListenerDeleted()
-{
- m_webEventListener = 0;
-}
-
-} // namespace WebKit
+/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "EventListenerWrapper.h" + +#include "Event.h" +#include "EventListener.h" + +#include "WebDOMEvent.h" +#include "WebDOMEventListener.h" + +namespace WebKit { + +EventListenerWrapper::EventListenerWrapper(WebDOMEventListener* webDOMEventListener) + : EventListener(EventListener::NativeEventListenerType) + , m_webDOMEventListener(webDOMEventListener) +{ +} + +EventListenerWrapper::~EventListenerWrapper() +{ + if (m_webDOMEventListener) + m_webDOMEventListener->notifyEventListenerDeleted(this); +} + +bool EventListenerWrapper::operator==(const EventListener& listener) +{ + return this == &listener; +} + +void EventListenerWrapper::handleEvent(ScriptExecutionContext* context, Event* event) +{ + if (!m_webDOMEventListener) + return; + WebDOMEvent webDOMEvent(event); + m_webDOMEventListener->handleEvent(webDOMEvent); +} + +void EventListenerWrapper::webDOMEventListenerDeleted() +{ + m_webDOMEventListener = 0; +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/EventListenerWrapper.h b/WebKit/chromium/src/EventListenerWrapper.h index 2a0cbbb..75b6a95 100644 --- a/WebKit/chromium/src/EventListenerWrapper.h +++ b/WebKit/chromium/src/EventListenerWrapper.h @@ -1,62 +1,64 @@ -/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 THE COPYRIGHT
- * OWNER 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.
- */
-
-#ifndef EventListenerWrapper_h
-#define EventListenerWrapper_h
-
-#include "EventListener.h"
-
-namespace WebCore {
-class ScriptExecutionContext;
-}
-
-using namespace WebCore;
-
-namespace WebKit {
-
-class WebEventListener;
-
-class EventListenerWrapper : public EventListener {
-public:
- EventListenerWrapper(WebEventListener*);
- ~EventListenerWrapper();
-
- virtual bool operator==(const EventListener&);
- virtual void handleEvent(ScriptExecutionContext*, Event*);
-
- void webEventListenerDeleted();
-
-private:
- WebEventListener* m_webEventListener;
-};
-
-} // namespace WebKit
-
-#endif
+/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef EventListenerWrapper_h +#define EventListenerWrapper_h + +#include "EventListener.h" + +namespace WebCore { +class ScriptExecutionContext; +} + +using namespace WebCore; + +namespace WebKit { + +class WebDOMEventListener; + +// FIXME: Remove the DeprecatedEventListenerWrapper class below once Chromium +// switched to using WebDOMEvent. +class EventListenerWrapper : public EventListener { +public: + EventListenerWrapper(WebDOMEventListener*); + ~EventListenerWrapper(); + + virtual bool operator==(const EventListener&); + virtual void handleEvent(ScriptExecutionContext*, Event*); + + void webDOMEventListenerDeleted(); + +private: + WebDOMEventListener* m_webDOMEventListener; +}; + +} // namespace WebKit + +#endif diff --git a/WebKit/chromium/src/Extensions3DChromium.cpp b/WebKit/chromium/src/Extensions3DChromium.cpp new file mode 100644 index 0000000..fe04986 --- /dev/null +++ b/WebKit/chromium/src/Extensions3DChromium.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" + +#if ENABLE(3D_CANVAS) + +#include "Extensions3DChromium.h" + +#include "GraphicsContext3D.h" +#include "GraphicsContext3DInternal.h" + +namespace WebCore { + +Extensions3DChromium::Extensions3DChromium(GraphicsContext3DInternal* internal) + : m_internal(internal) +{ +} + +Extensions3DChromium::~Extensions3DChromium() +{ +} + +bool Extensions3DChromium::supports(const String& name) +{ + return m_internal->supportsExtension(name); +} + +int Extensions3DChromium::getGraphicsResetStatusARB() +{ + return m_internal->isContextLost() ? static_cast<int>(Extensions3D::UNKNOWN_CONTEXT_RESET_ARB) : static_cast<int>(GraphicsContext3D::NO_ERROR); +} + +void* Extensions3DChromium::mapBufferSubDataCHROMIUM(unsigned target, int offset, int size, unsigned access) +{ + return m_internal->mapBufferSubDataCHROMIUM(target, offset, size, access); +} + +void Extensions3DChromium::unmapBufferSubDataCHROMIUM(const void* data) +{ + m_internal->unmapBufferSubDataCHROMIUM(data); +} + +void* Extensions3DChromium::mapTexSubImage2DCHROMIUM(unsigned target, int level, int xoffset, int yoffset, int width, int height, unsigned format, unsigned type, unsigned access) +{ + return m_internal->mapTexSubImage2DCHROMIUM(target, level, xoffset, yoffset, width, height, format, type, access); +} + +void Extensions3DChromium::unmapTexSubImage2DCHROMIUM(const void* data) +{ + m_internal->unmapTexSubImage2DCHROMIUM(data); +} + +void Extensions3DChromium::copyTextureToParentTextureCHROMIUM(unsigned texture, unsigned parentTexture) +{ + m_internal->copyTextureToParentTextureCHROMIUM(texture, parentTexture); +} + +} // namespace WebCore + +#endif // ENABLE(3D_CANVAS) diff --git a/WebKit/chromium/src/ExternalPopupMenu.cpp b/WebKit/chromium/src/ExternalPopupMenu.cpp new file mode 100644 index 0000000..f7f9862 --- /dev/null +++ b/WebKit/chromium/src/ExternalPopupMenu.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "ExternalPopupMenu.h" + +#include "FrameView.h" +#include "IntPoint.h" +#include "PopupMenuClient.h" +#include "TextDirection.h" +#include "WebExternalPopupMenu.h" +#include "WebMenuItemInfo.h" +#include "WebPopupMenuInfo.h" +#include "WebVector.h" +#include "WebViewClient.h" + +using namespace WebCore; + +namespace WebKit { + +ExternalPopupMenu::ExternalPopupMenu(PopupMenuClient* popupMenuClient, + WebViewClient* webViewClient) + : m_popupMenuClient(popupMenuClient) + , m_webViewClient(webViewClient) + , m_webExternalPopupMenu(0) +{ +} + +ExternalPopupMenu::~ExternalPopupMenu() +{ +} + +void ExternalPopupMenu::show(const IntRect& rect, FrameView* v, int index) +{ + // WebCore reuses the PopupMenu of a page. + // For simplicity, we do recreate the actual external popup everytime. + hide(); + + WebPopupMenuInfo info; + getPopupMenuInfo(&info); + if (info.items.isEmpty()) + return; + m_webExternalPopupMenu = + m_webViewClient->createExternalPopupMenu(info, this); + m_webExternalPopupMenu->show(v->contentsToWindow(rect)); +} + +void ExternalPopupMenu::hide() +{ + if (m_popupMenuClient) + m_popupMenuClient->popupDidHide(); + if (!m_webExternalPopupMenu) + return; + m_webExternalPopupMenu->close(); + m_webExternalPopupMenu = 0; +} + +void ExternalPopupMenu::updateFromElement() +{ +} + +void ExternalPopupMenu::disconnectClient() +{ + hide(); + m_popupMenuClient = 0; +} + +void ExternalPopupMenu::didChangeSelection(int index) +{ + if (m_popupMenuClient) + m_popupMenuClient->selectionChanged(index); +} + +void ExternalPopupMenu::didAcceptIndex(int index) +{ + // Calling methods on the PopupMenuClient might lead to this object being + // derefed. This ensures it does not get deleted while we are running this + // method. + RefPtr<ExternalPopupMenu> guard(this); + + if (m_popupMenuClient) { + m_popupMenuClient->valueChanged(index); + // The call to valueChanged above might have lead to a call to + // disconnectClient, so we might not have a PopupMenuClient anymore. + if (m_popupMenuClient) + m_popupMenuClient->popupDidHide(); + } + m_webExternalPopupMenu = 0; +} + +void ExternalPopupMenu::didCancel() +{ + // See comment in didAcceptIndex on why we need this. + RefPtr<ExternalPopupMenu> guard(this); + + if (m_popupMenuClient) + m_popupMenuClient->popupDidHide(); + m_webExternalPopupMenu = 0; +} + +void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo* info) +{ + int itemCount = m_popupMenuClient->listSize(); + WebVector<WebPopupMenuInfo::Item> items( + static_cast<size_t>(itemCount)); + for (int i = 0; i < itemCount; ++i) { + WebPopupMenuInfo::Item& popupItem = items[i]; + popupItem.label = m_popupMenuClient->itemText(i); + if (m_popupMenuClient->itemIsSeparator(i)) + popupItem.type = WebMenuItemInfo::Separator; + else if (m_popupMenuClient->itemIsLabel(i)) + popupItem.type = WebMenuItemInfo::Group; + else + popupItem.type = WebMenuItemInfo::Option; + popupItem.enabled = m_popupMenuClient->itemIsEnabled(i); + } + + info->itemHeight = m_popupMenuClient->menuStyle().font().height(); + info->itemFontSize = + static_cast<int>(m_popupMenuClient->menuStyle().font().size()); + info->selectedIndex = m_popupMenuClient->selectedIndex(); + info->rightAligned = + m_popupMenuClient->menuStyle().textDirection() == WebCore::RTL; + info->items.swap(items); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/ExternalPopupMenu.h b/WebKit/chromium/src/ExternalPopupMenu.h new file mode 100644 index 0000000..6963e8d --- /dev/null +++ b/WebKit/chromium/src/ExternalPopupMenu.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef ExternalPopupMenu_h +#define ExternalPopupMenu_h + +#include "PopupMenu.h" +#include "WebExternalPopupMenuClient.h" + +namespace WebCore { +class FrameView; +class IntRect; +class PopupMenuClient; +} + +namespace WebKit { + +class WebExternalPopupMenu; +class WebViewClient; +struct WebPopupMenuInfo; + +// The ExternalPopupMenu connects the actual implementation of the popup menu +// to the WebCore popup menu. +class ExternalPopupMenu : public WebCore::PopupMenu, + public WebExternalPopupMenuClient { +public: + ExternalPopupMenu(WebCore::PopupMenuClient*, WebViewClient*); + virtual ~ExternalPopupMenu(); + +private: + // WebCore::PopupMenu methods: + virtual void show(const WebCore::IntRect&, WebCore::FrameView*, int index); + virtual void hide(); + virtual void updateFromElement(); + virtual void disconnectClient(); + + // WebExternalPopupClient methods: + virtual void didChangeSelection(int index); + virtual void didAcceptIndex(int index); + virtual void didCancel(); + + // Fills |info| with the popup menu information contained in the + // WebCore::PopupMenuClient associated with this ExternalPopupMenu. + void getPopupMenuInfo(WebPopupMenuInfo* info); + + WebCore::PopupMenuClient* m_popupMenuClient; + WebViewClient* m_webViewClient; + + // The actual implementor of the show menu. + WebExternalPopupMenu* m_webExternalPopupMenu; +}; + +} // namespace WebKit + +#endif // ExternalPopupMenu_h diff --git a/WebKit/chromium/src/FrameLoaderClientImpl.cpp b/WebKit/chromium/src/FrameLoaderClientImpl.cpp index b984308..9d79599 100644 --- a/WebKit/chromium/src/FrameLoaderClientImpl.cpp +++ b/WebKit/chromium/src/FrameLoaderClientImpl.cpp @@ -32,12 +32,15 @@ #include "FrameLoaderClientImpl.h" #include "Chrome.h" -#include "CString.h" #include "Document.h" #include "DocumentLoader.h" #include "FormState.h" #include "FrameLoader.h" #include "FrameLoadRequest.h" +#include "FrameNetworkingContextImpl.h" +#include "FrameView.h" +#include "HTTPParsers.h" +#include "HistoryItem.h" #include "HitTestResult.h" #include "HTMLAppletElement.h" #include "HTMLFormElement.h" // needed by FormState.h @@ -48,6 +51,8 @@ #include "PlatformString.h" #include "PluginData.h" #include "PluginDataChromium.h" +#include "ProgressTracker.h" +#include "Settings.h" #include "StringExtras.h" #include "WebDataSourceImpl.h" #include "WebDevToolsAgentPrivate.h" @@ -71,6 +76,7 @@ #include "WindowFeatures.h" #include "WrappedResourceRequest.h" #include "WrappedResourceResponse.h" +#include <wtf/text/CString.h> using namespace WebCore; @@ -142,6 +148,14 @@ void FrameLoaderClientImpl::didCreateIsolatedScriptContext() m_webFrame->client()->didCreateIsolatedScriptContext(m_webFrame); } +bool FrameLoaderClientImpl::allowScriptExtension(const String& extensionName, + int extensionGroup) +{ + if (m_webFrame->client()) + return m_webFrame->client()->allowScriptExtension(m_webFrame, extensionName, extensionGroup); + return false; +} + void FrameLoaderClientImpl::didPerformFirstNavigation() const { } @@ -180,6 +194,18 @@ bool FrameLoaderClientImpl::allowImages(bool enabledPerSettings) return enabledPerSettings; } +void FrameLoaderClientImpl::didNotAllowScript() +{ + if (m_webFrame->client()) + m_webFrame->client()->didNotAllowScript(m_webFrame); +} + +void FrameLoaderClientImpl::didNotAllowPlugins() +{ + if (m_webFrame->client()) + m_webFrame->client()->didNotAllowPlugins(m_webFrame); +} + bool FrameLoaderClientImpl::hasWebView() const { return m_webFrame->viewImpl(); @@ -232,10 +258,15 @@ void FrameLoaderClientImpl::detachedFromParent3() // go to a page and then navigate to a new page without getting any asserts // or crashes. m_webFrame->frame()->script()->proxy()->clearForClose(); - + + // Alert the client that the frame is being detached. This is the last + // chance we have to communicate with the client. + if (m_webFrame->client()) + m_webFrame->client()->frameDetached(m_webFrame); + // Stop communicating with the WebFrameClient at this point since we are no // longer associated with the Page. - m_webFrame->dropClient(); + m_webFrame->setClient(0); } // This function is responsible for associating the |identifier| with a given @@ -258,7 +289,7 @@ void FrameLoaderClientImpl::assignIdentifierToInitialRequest( // this includes images and xmlhttp requests. It is important to note that a // subresource is NOT limited to stuff loaded through the frame's subresource // loader. Synchronous xmlhttp requests for example, do not go through the -// subresource loader, but we still label them as TargetIsSubResource. +// subresource loader, but we still label them as TargetIsSubresource. // // The important edge cases to consider when modifying this function are // how synchronous resource loads are treated during load/unload threshold. @@ -392,12 +423,6 @@ bool FrameLoaderClientImpl::dispatchDidLoadResourceFromMemoryCache( return false; // Do not suppress remaining notifications } -void FrameLoaderClientImpl::dispatchDidLoadResourceByXMLHttpRequest( - unsigned long identifier, - const ScriptString& source) -{ -} - void FrameLoaderClientImpl::dispatchDidHandleOnloadEvents() { if (m_webFrame->client()) @@ -556,7 +581,7 @@ void FrameLoaderClientImpl::dispatchWillPerformClientRedirect( } } -void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage() +void FrameLoaderClientImpl::dispatchDidNavigateWithinPage() { // Anchor fragment navigations are not normal loads, so we need to synthesize // some events for our delegate. @@ -567,12 +592,17 @@ void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage() // them for fragment redirection that happens in window.onload handler. // See https://bugs.webkit.org/show_bug.cgi?id=31838 bool loaderCompleted = - !m_webFrame->frame()->page()->mainFrame()->loader()->isLoading(); + !webView->page()->mainFrame()->loader()->activeDocumentLoader()->isLoadingInAPISense(); // Generate didStartLoading if loader is completed. if (webView->client() && loaderCompleted) webView->client()->didStartLoading(); + // We need to classify some hash changes as client redirects. + // FIXME: It seems wrong that the currentItem can sometimes be null. + HistoryItem* currentItem = m_webFrame->frame()->loader()->history()->currentItem(); + bool isHashChange = !currentItem || !currentItem->stateObject(); + WebDataSourceImpl* ds = m_webFrame->dataSourceImpl(); ASSERT(ds); // Should not be null when navigating to a reference fragment! if (ds) { @@ -583,27 +613,29 @@ void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage() ds->clearRedirectChain(); } - // Figure out if this location change is because of a JS-initiated - // client redirect (e.g onload/setTimeout document.location.href=). - // FIXME: (bugs 1085325, 1046841) We don't get proper redirect - // performed/cancelled notifications across anchor navigations, so the - // other redirect-tracking code in this class (see - // dispatch*ClientRedirect() and dispatchDidStartProvisionalLoad) is - // insufficient to catch and properly flag these transitions. Once a - // proper fix for this bug is identified and applied the following - // block may no longer be required. - bool wasClientRedirect = - (url == m_expectedClientRedirectDest && chainEnd == m_expectedClientRedirectSrc) - || !m_webFrame->isProcessingUserGesture(); - - if (wasClientRedirect) { - if (m_webFrame->client()) - m_webFrame->client()->didCompleteClientRedirect(m_webFrame, chainEnd); - ds->appendRedirect(chainEnd); - // Make sure we clear the expected redirect since we just effectively - // completed it. - m_expectedClientRedirectSrc = KURL(); - m_expectedClientRedirectDest = KURL(); + if (isHashChange) { + // Figure out if this location change is because of a JS-initiated + // client redirect (e.g onload/setTimeout document.location.href=). + // FIXME: (b/1085325, b/1046841) We don't get proper redirect + // performed/cancelled notifications across anchor navigations, so the + // other redirect-tracking code in this class (see + // dispatch*ClientRedirect() and dispatchDidStartProvisionalLoad) is + // insufficient to catch and properly flag these transitions. Once a + // proper fix for this bug is identified and applied the following + // block may no longer be required. + bool wasClientRedirect = + (url == m_expectedClientRedirectDest && chainEnd == m_expectedClientRedirectSrc) + || !m_webFrame->isProcessingUserGesture(); + + if (wasClientRedirect) { + if (m_webFrame->client()) + m_webFrame->client()->didCompleteClientRedirect(m_webFrame, chainEnd); + ds->appendRedirect(chainEnd); + // Make sure we clear the expected redirect since we just effectively + // completed it. + m_expectedClientRedirectSrc = KURL(); + m_expectedClientRedirectDest = KURL(); + } } // Regardless of how we got here, we are navigating to a URL so we need to @@ -614,26 +646,32 @@ void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage() bool isNewNavigation; webView->didCommitLoad(&isNewNavigation); if (m_webFrame->client()) - m_webFrame->client()->didChangeLocationWithinPage(m_webFrame, isNewNavigation); + m_webFrame->client()->didNavigateWithinPage(m_webFrame, isNewNavigation); // Generate didStopLoading if loader is completed. if (webView->client() && loaderCompleted) webView->client()->didStopLoading(); } +void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage() +{ + if (m_webFrame) + m_webFrame->client()->didChangeLocationWithinPage(m_webFrame); +} + void FrameLoaderClientImpl::dispatchDidPushStateWithinPage() { - // FIXME + dispatchDidNavigateWithinPage(); } void FrameLoaderClientImpl::dispatchDidReplaceStateWithinPage() { - // FIXME + dispatchDidNavigateWithinPage(); } void FrameLoaderClientImpl::dispatchDidPopStateWithinPage() { - // FIXME + // Ignored since dispatchDidNavigateWithinPage was already called. } void FrameLoaderClientImpl::dispatchWillClose() @@ -700,6 +738,12 @@ void FrameLoaderClientImpl::dispatchDidReceiveTitle(const String& title) m_webFrame->client()->didReceiveTitle(m_webFrame, title); } +void FrameLoaderClientImpl::dispatchDidChangeIcons() +{ + if (m_webFrame->client()) + m_webFrame->client()->didChangeIcons(m_webFrame); +} + void FrameLoaderClientImpl::dispatchDidCommitLoad() { WebViewImpl* webview = m_webFrame->viewImpl(); @@ -708,9 +752,6 @@ void FrameLoaderClientImpl::dispatchDidCommitLoad() if (m_webFrame->client()) m_webFrame->client()->didCommitProvisionalLoad(m_webFrame, isNewNavigation); - - if (webview->devToolsAgentPrivate()) - webview->devToolsAgentPrivate()->didCommitProvisionalLoad(m_webFrame, isNewNavigation); } void FrameLoaderClientImpl::dispatchDidFailProvisionalLoad( @@ -762,19 +803,21 @@ void FrameLoaderClientImpl::dispatchDidFinishLoad() void FrameLoaderClientImpl::dispatchDidFirstLayout() { + if (m_webFrame->client()) + m_webFrame->client()->didFirstLayout(m_webFrame); } void FrameLoaderClientImpl::dispatchDidFirstVisuallyNonEmptyLayout() { - // FIXME: called when webkit finished layout of a page that was visually non-empty. - // All resources have not necessarily finished loading. + if (m_webFrame->client()) + m_webFrame->client()->didFirstVisuallyNonEmptyLayout(m_webFrame); } -Frame* FrameLoaderClientImpl::dispatchCreatePage() +Frame* FrameLoaderClientImpl::dispatchCreatePage(const NavigationAction& action) { struct WindowFeatures features; Page* newPage = m_webFrame->frame()->page()->chrome()->createWindow( - m_webFrame->frame(), FrameLoadRequest(), features); + m_webFrame->frame(), FrameLoadRequest(), features, action); // Make sure that we have a valid disposition. This should have been set in // the preceeding call to dispatchDecidePolicyForNewWindowAction. @@ -797,38 +840,6 @@ void FrameLoaderClientImpl::dispatchShow() webView->client()->show(webView->initialNavigationPolicy()); } -static bool shouldTreatAsAttachment(const ResourceResponse& response) -{ - const String& contentDisposition = - response.httpHeaderField("Content-Disposition"); - if (contentDisposition.isEmpty()) - return false; - - // Some broken sites just send - // Content-Disposition: ; filename="file" - // screen those out here. - if (contentDisposition.startsWith(";")) - return false; - - if (contentDisposition.startsWith("inline", false)) - return false; - - // Some broken sites just send - // Content-Disposition: filename="file" - // without a disposition token... screen those out. - if (contentDisposition.startsWith("filename", false)) - return false; - - // Also in use is Content-Disposition: name="file" - if (contentDisposition.startsWith("name", false)) - return false; - - // We have a content-disposition of "attachment" or unknown. - // RFC 2183, section 2.8 says that an unknown disposition - // value should be treated as "attachment" - return true; -} - void FrameLoaderClientImpl::dispatchDecidePolicyForMIMEType( FramePolicyFunction function, const String& mimeType, @@ -843,7 +854,7 @@ void FrameLoaderClientImpl::dispatchDecidePolicyForMIMEType( if (statusCode == 204 || statusCode == 205) { // The server does not want us to replace the page contents. action = PolicyIgnore; - } else if (shouldTreatAsAttachment(response)) { + } else if (WebCore::contentDispositionType(response.httpHeaderField("Content-Disposition")) == WebCore::ContentDispositionAttachment) { // The server wants us to download instead of replacing the page contents. // Downloading is handled by the embedder, but we still get the initial // response so that we can ignore it and clean up properly. @@ -898,51 +909,48 @@ void FrameLoaderClientImpl::dispatchDecidePolicyForNavigationAction( // The null check here is to fix a crash that seems strange // (see - https://bugs.webkit.org/show_bug.cgi?id=23554). if (m_webFrame->client() && !request.url().isNull()) { - WebNavigationPolicy navigationPolicy = WebNavigationPolicyCurrentTab; - actionSpecifiesNavigationPolicy(action, &navigationPolicy); - - // Give the delegate a chance to change the navigation policy. - const WebDataSourceImpl* ds = m_webFrame->provisionalDataSourceImpl(); - if (ds) { - KURL url = ds->request().url(); - if (url.protocolIs(backForwardNavigationScheme)) { - handleBackForwardNavigation(url); - navigationPolicy = WebNavigationPolicyIgnore; - } else { - bool isRedirect = ds->hasRedirectChain(); - - WebNavigationType webnavType = - WebDataSourceImpl::toWebNavigationType(action.type()); - - RefPtr<Node> node; - for (const Event* event = action.event(); event; event = event->underlyingEvent()) { - if (event->isMouseEvent()) { - const MouseEvent* mouseEvent = - static_cast<const MouseEvent*>(event); - node = m_webFrame->frame()->eventHandler()->hitTestResultAtPoint( - mouseEvent->absoluteLocation(), false).innerNonSharedNode(); - break; - } - } - WebNode originatingNode(node); - - navigationPolicy = m_webFrame->client()->decidePolicyForNavigation( - m_webFrame, ds->request(), webnavType, originatingNode, - navigationPolicy, isRedirect); - } - } - - if (navigationPolicy == WebNavigationPolicyCurrentTab) - policyAction = PolicyUse; - else if (navigationPolicy == WebNavigationPolicyDownload) - policyAction = PolicyDownload; - else { - if (navigationPolicy != WebNavigationPolicyIgnore) { - WrappedResourceRequest webreq(request); - m_webFrame->client()->loadURLExternally(m_webFrame, webreq, navigationPolicy); - } - policyAction = PolicyIgnore; - } + WebNavigationPolicy navigationPolicy = WebNavigationPolicyCurrentTab; + actionSpecifiesNavigationPolicy(action, &navigationPolicy); + + // Give the delegate a chance to change the navigation policy. + const WebDataSourceImpl* ds = m_webFrame->provisionalDataSourceImpl(); + if (ds) { + KURL url = ds->request().url(); + ASSERT(!url.protocolIs(backForwardNavigationScheme)); + + bool isRedirect = ds->hasRedirectChain(); + + WebNavigationType webnavType = + WebDataSourceImpl::toWebNavigationType(action.type()); + + RefPtr<Node> node; + for (const Event* event = action.event(); event; event = event->underlyingEvent()) { + if (event->isMouseEvent()) { + const MouseEvent* mouseEvent = + static_cast<const MouseEvent*>(event); + node = m_webFrame->frame()->eventHandler()->hitTestResultAtPoint( + mouseEvent->absoluteLocation(), false).innerNonSharedNode(); + break; + } + } + WebNode originatingNode(node); + + navigationPolicy = m_webFrame->client()->decidePolicyForNavigation( + m_webFrame, ds->request(), webnavType, originatingNode, + navigationPolicy, isRedirect); + } + + if (navigationPolicy == WebNavigationPolicyCurrentTab) + policyAction = PolicyUse; + else if (navigationPolicy == WebNavigationPolicyDownload) + policyAction = PolicyDownload; + else { + if (navigationPolicy != WebNavigationPolicyIgnore) { + WrappedResourceRequest webreq(request); + m_webFrame->client()->loadURLExternally(m_webFrame, webreq, navigationPolicy); + } + policyAction = PolicyIgnore; + } } (m_webFrame->frame()->loader()->policyChecker()->*function)(policyAction); @@ -958,6 +966,12 @@ void FrameLoaderClientImpl::dispatchUnableToImplementPolicy(const ResourceError& m_webFrame->client()->unableToImplementPolicyWithError(m_webFrame, error); } +void FrameLoaderClientImpl::dispatchWillSendSubmitEvent(HTMLFormElement* form) +{ + if (m_webFrame->client()) + m_webFrame->client()->willSendSubmitEvent(m_webFrame, WebFormElement(form)); +} + void FrameLoaderClientImpl::dispatchWillSubmitForm(FramePolicyFunction function, PassRefPtr<FormState> formState) { @@ -997,7 +1011,12 @@ void FrameLoaderClientImpl::postProgressStartedNotification() void FrameLoaderClientImpl::postProgressEstimateChangedNotification() { - // FIXME + WebViewImpl* webview = m_webFrame->viewImpl(); + if (webview && webview->client()) { + webview->client()->didChangeLoadProgress( + m_webFrame, m_webFrame->frame()->page()->progress()->estimatedProgress()); + } + } void FrameLoaderClientImpl::postProgressFinishedNotification() @@ -1048,8 +1067,7 @@ void FrameLoaderClientImpl::committedLoad(DocumentLoader* loader, const char* da // If we are sending data to MediaDocument, we should stop here // and cancel the request. - if (m_webFrame->frame()->document() - && m_webFrame->frame()->document()->isMediaDocument()) + if (m_webFrame->frame()->document()->isMediaDocument()) loader->cancelMainResourceLoad(pluginWillHandleLoadError(loader->response())); // The plugin widget could have been created in the m_webFrame->DidReceiveData @@ -1060,7 +1078,11 @@ void FrameLoaderClientImpl::committedLoad(DocumentLoader* loader, const char* da m_pluginWidget->didReceiveResponse( m_webFrame->frame()->loader()->activeDocumentLoader()->response()); } - m_pluginWidget->didReceiveData(data, length); + + // It's possible that the above call removed the pointer to the plugin, so + // check before calling it. + if (m_pluginWidget.get()) + m_pluginWidget->didReceiveData(data, length); } } @@ -1075,7 +1097,7 @@ void FrameLoaderClientImpl::finishedLoading(DocumentLoader* dl) // However, we only want to do this if makeRepresentation has been called, to // match the behavior on the Mac. if (m_hasRepresentation) - dl->frameLoader()->setEncoding("", false); + dl->frameLoader()->writer()->setEncoding("", false); } } @@ -1087,10 +1109,28 @@ void FrameLoaderClientImpl::updateGlobalHistoryRedirectLinks() { } -bool FrameLoaderClientImpl::shouldGoToHistoryItem(HistoryItem*) const +bool FrameLoaderClientImpl::shouldGoToHistoryItem(HistoryItem* item) const { - // FIXME - return true; + const KURL& url = item->url(); + if (!url.protocolIs(backForwardNavigationScheme)) + return true; + + // Else, we'll punt this history navigation to the embedder. It is + // necessary that we intercept this here, well before the FrameLoader + // has made any state changes for this history traversal. + + bool ok; + int offset = url.lastPathComponent().toIntStrict(&ok); + if (!ok) { + ASSERT_NOT_REACHED(); + return false; + } + + WebViewImpl* webview = m_webFrame->viewImpl(); + if (webview->client()) + webview->client()->navigateBackForwardSoon(offset); + + return false; } void FrameLoaderClientImpl::dispatchDidAddBackForwardItem(HistoryItem*) const @@ -1184,6 +1224,12 @@ bool FrameLoaderClientImpl::canHandleRequest(const ResourceRequest& request) con m_webFrame, WrappedResourceRequest(request)); } +bool FrameLoaderClientImpl::canShowMIMETypeAsHTML(const String& MIMEType) const +{ + notImplemented(); + return false; +} + bool FrameLoaderClientImpl::canShowMIMEType(const String& mimeType) const { // This method is called to determine if the media type can be shown @@ -1302,6 +1348,10 @@ void FrameLoaderClientImpl::transitionToCommittedForNewPage() makeDocumentView(); } +void FrameLoaderClientImpl::dispatchDidBecomeFrameset(bool) +{ +} + bool FrameLoaderClientImpl::canCachePage() const { // Since we manage the cache, always report this page as non-cacheable to @@ -1332,6 +1382,28 @@ PassRefPtr<Frame> FrameLoaderClientImpl::createFrame( return m_webFrame->createChildFrame(frameRequest, ownerElement); } +void FrameLoaderClientImpl::didTransferChildFrameToNewDocument(Page*) +{ + ASSERT(m_webFrame->frame()->ownerElement()); + + WebFrameImpl* newParent = static_cast<WebFrameImpl*>(m_webFrame->parent()); + if (!newParent || !newParent->client()) + return; + + // Replace the client since the old client may be destroyed when the + // previous page is closed. + m_webFrame->setClient(newParent->client()); +} + +void FrameLoaderClientImpl::transferLoadingResourceFromPage(unsigned long identifier, DocumentLoader* loader, const ResourceRequest& request, Page* oldPage) +{ + assignIdentifierToInitialRequest(identifier, loader, request); + + WebFrameImpl* oldWebFrame = WebFrameImpl::fromFrame(oldPage->mainFrame()); + if (oldWebFrame && oldWebFrame->client()) + oldWebFrame->client()->removeIdentifierForRequest(identifier); +} + PassRefPtr<Widget> FrameLoaderClientImpl::createPlugin( const IntSize& size, // FIXME: how do we use this? HTMLPlugInElement* element, @@ -1341,20 +1413,6 @@ PassRefPtr<Widget> FrameLoaderClientImpl::createPlugin( const String& mimeType, bool loadManually) { -#if !OS(WINDOWS) - // WebCore asks us to make a plugin even if we don't have a - // registered handler, with a comment saying it's so we can display - // the broken plugin icon. In Chromium, we normally register a - // fallback plugin handler that allows you to install a missing - // plugin. Since we don't yet have a default plugin handler, we - // need to return null here rather than going through all the - // plugin-creation IPCs only to discover we don't have a plugin - // registered, which causes a crash. - // FIXME: remove me once we have a default plugin. - if (objectContentType(url, mimeType) != ObjectContentNetscapePlugin) - return 0; -#endif - if (!m_webFrame->client()) return 0; @@ -1387,7 +1445,8 @@ PassRefPtr<Widget> FrameLoaderClientImpl::createPlugin( // (e.g., acrobat reader). void FrameLoaderClientImpl::redirectDataToPlugin(Widget* pluginWidget) { - m_pluginWidget = static_cast<WebPluginContainerImpl*>(pluginWidget); + if (pluginWidget->isPluginContainer()) + m_pluginWidget = static_cast<WebPluginContainerImpl*>(pluginWidget); ASSERT(m_pluginWidget.get()); } @@ -1452,34 +1511,40 @@ bool FrameLoaderClientImpl::actionSpecifiesNavigationPolicy( const NavigationAction& action, WebNavigationPolicy* policy) { - if ((action.type() != NavigationTypeLinkClicked) || !action.event()->isMouseEvent()) + const MouseEvent* event = 0; + if (action.type() == NavigationTypeLinkClicked + && action.event()->isMouseEvent()) + event = static_cast<const MouseEvent*>(action.event()); + else if (action.type() == NavigationTypeFormSubmitted + && action.event() + && action.event()->underlyingEvent() + && action.event()->underlyingEvent()->isMouseEvent()) + event = static_cast<const MouseEvent*>(action.event()->underlyingEvent()); + + if (!event) return false; - const MouseEvent* event = static_cast<const MouseEvent*>(action.event()); return WebViewImpl::navigationPolicyFromMouseEvent( event->button(), event->ctrlKey(), event->shiftKey(), event->altKey(), event->metaKey(), policy); } -void FrameLoaderClientImpl::handleBackForwardNavigation(const KURL& url) -{ - ASSERT(url.protocolIs(backForwardNavigationScheme)); - - bool ok; - int offset = url.lastPathComponent().toIntStrict(&ok); - if (!ok) - return; - - WebViewImpl* webview = m_webFrame->viewImpl(); - if (webview->client()) - webview->client()->navigateBackForwardSoon(offset); -} - PassOwnPtr<WebPluginLoadObserver> FrameLoaderClientImpl::pluginLoadObserver() { WebDataSourceImpl* ds = WebDataSourceImpl::fromDocumentLoader( m_webFrame->frame()->loader()->activeDocumentLoader()); + if (!ds) { + // We can arrive here if a popstate event handler detaches this frame. + // FIXME: Remove this code once http://webkit.org/b/36202 is fixed. + ASSERT(!m_webFrame->frame()->page()); + return 0; + } return ds->releasePluginLoadObserver(); } +PassRefPtr<FrameNetworkingContext> FrameLoaderClientImpl::createNetworkingContext() +{ + return FrameNetworkingContextImpl::create(m_webFrame->frame()); +} + } // namespace WebKit diff --git a/WebKit/chromium/src/FrameLoaderClientImpl.h b/WebKit/chromium/src/FrameLoaderClientImpl.h index 901600c..ef00ed3 100644 --- a/WebKit/chromium/src/FrameLoaderClientImpl.h +++ b/WebKit/chromium/src/FrameLoaderClientImpl.h @@ -31,14 +31,12 @@ #ifndef FrameLoaderClientImpl_h #define FrameLoaderClientImpl_h -// FIXME: remove this relative path once consumers from glue are removed. -#include "../public/WebNavigationPolicy.h" #include "FrameLoaderClient.h" #include "KURL.h" +#include "WebNavigationPolicy.h" #include <wtf/PassOwnPtr.h> #include <wtf/RefPtr.h> - namespace WebKit { class WebFrameImpl; @@ -71,6 +69,10 @@ public: // in garbage collection. virtual void didCreateIsolatedScriptContext(); + // Returns true if we should allow the given V8 extension to be added to + // the script context at the currently loading page and given extension group. + virtual bool allowScriptExtension(const String& extensionName, int extensionGroup); + virtual bool hasWebView() const; virtual bool hasFrameView() const; virtual void makeRepresentation(WebCore::DocumentLoader*); @@ -89,11 +91,11 @@ public: virtual void dispatchDidFinishLoading(WebCore::DocumentLoader*, unsigned long identifier); virtual void dispatchDidFailLoading(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceError&); virtual bool dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, int length); - virtual void dispatchDidLoadResourceByXMLHttpRequest(unsigned long identifier, const WebCore::ScriptString&); virtual void dispatchDidHandleOnloadEvents(); virtual void dispatchDidReceiveServerRedirectForProvisionalLoad(); virtual void dispatchDidCancelClientRedirect(); virtual void dispatchWillPerformClientRedirect(const WebCore::KURL&, double interval, double fireDate); + virtual void dispatchDidNavigateWithinPage(); virtual void dispatchDidChangeLocationWithinPage(); virtual void dispatchDidPushStateWithinPage(); virtual void dispatchDidReplaceStateWithinPage(); @@ -101,7 +103,8 @@ public: virtual void dispatchWillClose(); virtual void dispatchDidReceiveIcon(); virtual void dispatchDidStartProvisionalLoad(); - virtual void dispatchDidReceiveTitle(const WebCore::String& title); + virtual void dispatchDidReceiveTitle(const WTF::String& title); + virtual void dispatchDidChangeIcons(); virtual void dispatchDidCommitLoad(); virtual void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&); virtual void dispatchDidFailLoad(const WebCore::ResourceError&); @@ -109,13 +112,14 @@ public: virtual void dispatchDidFinishLoad(); virtual void dispatchDidFirstLayout(); virtual void dispatchDidFirstVisuallyNonEmptyLayout(); - virtual WebCore::Frame* dispatchCreatePage(); + virtual WebCore::Frame* dispatchCreatePage(const WebCore::NavigationAction&); virtual void dispatchShow(); - virtual void dispatchDecidePolicyForMIMEType(WebCore::FramePolicyFunction function, const WebCore::String& mime_type, const WebCore::ResourceRequest&); - virtual void dispatchDecidePolicyForNewWindowAction(WebCore::FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState> form_state, const WebCore::String& frame_name); + virtual void dispatchDecidePolicyForMIMEType(WebCore::FramePolicyFunction function, const WTF::String& mime_type, const WebCore::ResourceRequest&); + virtual void dispatchDecidePolicyForNewWindowAction(WebCore::FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState> form_state, const WTF::String& frame_name); virtual void dispatchDecidePolicyForNavigationAction(WebCore::FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState> form_state); virtual void cancelPolicyCheck(); virtual void dispatchUnableToImplementPolicy(const WebCore::ResourceError&); + virtual void dispatchWillSendSubmitEvent(WebCore::HTMLFormElement*); virtual void dispatchWillSubmitForm(WebCore::FramePolicyFunction, PassRefPtr<WebCore::FormState>); virtual void dispatchDidLoadMainResource(WebCore::DocumentLoader*); virtual void revertToProvisionalState(WebCore::DocumentLoader*); @@ -148,9 +152,10 @@ public: virtual WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&); virtual bool shouldFallBack(const WebCore::ResourceError&); virtual bool canHandleRequest(const WebCore::ResourceRequest&) const; - virtual bool canShowMIMEType(const WebCore::String& MIMEType) const; - virtual bool representationExistsForURLScheme(const WebCore::String& URLScheme) const; - virtual WebCore::String generatedMIMETypeForURLScheme(const WebCore::String& URLScheme) const; + virtual bool canShowMIMEType(const WTF::String& MIMEType) const; + virtual bool canShowMIMETypeAsHTML(const String& MIMEType) const; + virtual bool representationExistsForURLScheme(const WTF::String& URLScheme) const; + virtual WTF::String generatedMIMETypeForURLScheme(const WTF::String& URLScheme) const; virtual void frameLoadCompleted(); virtual void saveViewStateToItem(WebCore::HistoryItem*); virtual void restoreViewState(); @@ -159,41 +164,48 @@ public: virtual void prepareForDataSourceReplacement(); virtual PassRefPtr<WebCore::DocumentLoader> createDocumentLoader( const WebCore::ResourceRequest&, const WebCore::SubstituteData&); - virtual void setTitle(const WebCore::String& title, const WebCore::KURL&); - virtual WebCore::String userAgent(const WebCore::KURL&); + virtual void setTitle(const WTF::String& title, const WebCore::KURL&); + virtual WTF::String userAgent(const WebCore::KURL&); virtual void savePlatformDataToCachedFrame(WebCore::CachedFrame*); virtual void transitionToCommittedFromCachedFrame(WebCore::CachedFrame*); virtual void transitionToCommittedForNewPage(); + virtual void dispatchDidBecomeFrameset(bool); virtual bool canCachePage() const; virtual void download( WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceRequest& initialRequest, const WebCore::ResourceResponse&); virtual PassRefPtr<WebCore::Frame> createFrame( - const WebCore::KURL& url, const WebCore::String& name, + const WebCore::KURL& url, const WTF::String& name, WebCore::HTMLFrameOwnerElement* ownerElement, - const WebCore::String& referrer, bool allowsScrolling, + const WTF::String& referrer, bool allowsScrolling, int marginWidth, int marginHeight); + virtual void didTransferChildFrameToNewDocument(WebCore::Page*); + virtual void transferLoadingResourceFromPage(unsigned long, WebCore::DocumentLoader*, const WebCore::ResourceRequest&, WebCore::Page*); virtual PassRefPtr<WebCore::Widget> createPlugin( const WebCore::IntSize&, WebCore::HTMLPlugInElement*, const WebCore::KURL&, - const Vector<WebCore::String>&, const Vector<WebCore::String>&, - const WebCore::String&, bool loadManually); + const Vector<WTF::String>&, const Vector<WTF::String>&, + const WTF::String&, bool loadManually); virtual void redirectDataToPlugin(WebCore::Widget* pluginWidget); virtual PassRefPtr<WebCore::Widget> createJavaAppletWidget( const WebCore::IntSize&, WebCore::HTMLAppletElement*, const WebCore::KURL& /* base_url */, - const Vector<WebCore::String>& paramNames, - const Vector<WebCore::String>& paramValues); + const Vector<WTF::String>& paramNames, + const Vector<WTF::String>& paramValues); virtual WebCore::ObjectContentType objectContentType( - const WebCore::KURL& url, const WebCore::String& mimeType); - virtual WebCore::String overrideMediaType() const; + const WebCore::KURL& url, const WTF::String& mimeType); + virtual WTF::String overrideMediaType() const; virtual void didPerformFirstNavigation() const; virtual void registerForIconNotification(bool listen = true); virtual void didChangeScrollOffset(); virtual bool allowJavaScript(bool enabledPerSettings); virtual bool allowPlugins(bool enabledPerSettings); virtual bool allowImages(bool enabledPerSettings); + virtual void didNotAllowScript(); + virtual void didNotAllowPlugins(); + + virtual PassRefPtr<WebCore::FrameNetworkingContext> createNetworkingContext(); private: void makeDocumentView(); @@ -203,9 +215,6 @@ private: static bool actionSpecifiesNavigationPolicy( const WebCore::NavigationAction& action, WebNavigationPolicy* policy); - // Called when a dummy back-forward navigation is intercepted. - void handleBackForwardNavigation(const WebCore::KURL&); - PassOwnPtr<WebPluginLoadObserver> pluginLoadObserver(); // The WebFrame that owns this object and manages its lifetime. Therefore, diff --git a/WebKit/chromium/src/FrameNetworkingContextImpl.h b/WebKit/chromium/src/FrameNetworkingContextImpl.h new file mode 100644 index 0000000..8670506 --- /dev/null +++ b/WebKit/chromium/src/FrameNetworkingContextImpl.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef FrameNetworkingContextImpl_h +#define FrameNetworkingContextImpl_h + +#include "FrameNetworkingContext.h" + +namespace WebKit { + +class FrameNetworkingContextImpl : public WebCore::FrameNetworkingContext { +public: + static PassRefPtr<FrameNetworkingContextImpl> create(WebCore::Frame* frame) + { + return adoptRef(new FrameNetworkingContextImpl(frame)); + } + +private: + FrameNetworkingContextImpl(WebCore::Frame* frame) + : WebCore::FrameNetworkingContext(frame) + { + } +}; + +} + +#endif diff --git a/WebKit/chromium/src/GraphicsContext3D.cpp b/WebKit/chromium/src/GraphicsContext3D.cpp deleted file mode 100644 index 83574da..0000000 --- a/WebKit/chromium/src/GraphicsContext3D.cpp +++ /dev/null @@ -1,2218 +0,0 @@ -/* - * Copyright (C) 2009 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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 "config.h" - -#if ENABLE(3D_CANVAS) - -#include "GraphicsContext3D.h" - -#include "CachedImage.h" -#include "CString.h" -#include "HTMLCanvasElement.h" -#include "HTMLImageElement.h" -#include "ImageBuffer.h" -#include "ImageData.h" -#include "NotImplemented.h" -#include "WebGLBuffer.h" -#include "WebGLByteArray.h" -#include "WebGLFloatArray.h" -#include "WebGLFramebuffer.h" -#include "WebGLIntArray.h" -#include "WebGLProgram.h" -#include "WebGLRenderbuffer.h" -#include "WebGLRenderingContext.h" -#include "WebGLShader.h" -#include "WebGLTexture.h" -#include "WebGLUnsignedByteArray.h" - -#include <stdio.h> -#include <wtf/FastMalloc.h> - -#if OS(WINDOWS) -#include <windows.h> -#endif - -#include "GL/glew.h" - -#if PLATFORM(CG) -#include "GraphicsContext.h" -#include <CoreGraphics/CGContext.h> -#include <CoreGraphics/CGBitmapContext.h> -#include <CoreGraphics/CGImage.h> -#include <OpenGL/OpenGL.h> -#else -#define FLIP_FRAMEBUFFER_VERTICALLY -#endif - -#if PLATFORM(SKIA) -#include "NativeImageSkia.h" -#endif - -#if OS(DARWIN) -#define USE_TEXTURE_RECTANGLE_FOR_FRAMEBUFFER -#endif - -#if OS(LINUX) -#include <dlfcn.h> -#include "GL/glxew.h" -#endif - -using namespace std; - -namespace WebCore { - -// GraphicsContext3DInternal ----------------------------------------------------- - -// Uncomment this to render to a separate window for debugging -// #define RENDER_TO_DEBUGGING_WINDOW - -#define EXTRACT(val) (!val ? 0 : val->object()) - -class GraphicsContext3DInternal { -public: - GraphicsContext3DInternal(GraphicsContext3D::Attributes attrs); - ~GraphicsContext3DInternal(); - - bool makeContextCurrent(); - - PlatformGraphicsContext3D platformGraphicsContext3D() const; - Platform3DObject platformTexture() const; - - void reshape(int width, int height); - - void beginPaint(WebGLRenderingContext* context); - - bool validateTextureTarget(int target); - bool validateTextureParameter(int param); - - void activeTexture(unsigned long texture); - void bindBuffer(unsigned long target, - WebGLBuffer* buffer); - void bindFramebuffer(unsigned long target, - WebGLFramebuffer* framebuffer); - void bindTexture(unsigned long target, - WebGLTexture* texture); - void bufferDataImpl(unsigned long target, int size, const void* data, unsigned long usage); - void disableVertexAttribArray(unsigned long index); - void enableVertexAttribArray(unsigned long index); - unsigned long getError(); - GraphicsContext3D::Attributes getContextAttributes(); - void vertexAttribPointer(unsigned long indx, int size, int type, bool normalized, - unsigned long stride, unsigned long offset); - void viewportImpl(long x, long y, unsigned long width, unsigned long height); - - void synthesizeGLError(unsigned long error); - -private: - GraphicsContext3D::Attributes m_attrs; - - unsigned int m_texture; - unsigned int m_fbo; - unsigned int m_depthBuffer; - unsigned int m_cachedWidth, m_cachedHeight; - - // For tracking which FBO is bound - unsigned int m_boundFBO; - -#ifdef FLIP_FRAMEBUFFER_VERTICALLY - unsigned char* m_scanline; - void flipVertically(unsigned char* framebuffer, - unsigned int width, - unsigned int height); -#endif - - // Note: we aren't currently using this information, but we will - // need to in order to verify that all enabled vertex arrays have - // a valid buffer bound -- to avoid crashes on certain cards. - unsigned int m_boundArrayBuffer; - class VertexAttribPointerState { - public: - VertexAttribPointerState(); - - bool enabled; - unsigned long buffer; - unsigned long indx; - int size; - int type; - bool normalized; - unsigned long stride; - unsigned long offset; - }; - - enum { - NumTrackedPointerStates = 2 - }; - VertexAttribPointerState m_vertexAttribPointerState[NumTrackedPointerStates]; - - // Errors raised by synthesizeGLError(). - ListHashSet<unsigned long> m_syntheticErrors; - -#if PLATFORM(SKIA) - // If the width and height of the Canvas's backing store don't - // match those that we were given in the most recent call to - // reshape(), then we need an intermediate bitmap to read back the - // frame buffer into. This seems to happen when CSS styles are - // used to resize the Canvas. - SkBitmap* m_resizingBitmap; -#endif - - static bool s_initializedGLEW; -#if OS(WINDOWS) - HWND m_canvasWindow; - HDC m_canvasDC; - HGLRC m_contextObj; -#elif PLATFORM(CG) - CGLPBufferObj m_pbuffer; - CGLContextObj m_contextObj; - unsigned char* m_renderOutput; -#elif OS(LINUX) - GLXContext m_contextObj; - GLXPbuffer m_pbuffer; - - // In order to avoid problems caused by linking against libGL, we - // dynamically look up all the symbols we need. - // http://code.google.com/p/chromium/issues/detail?id=16800 - class GLConnection { - public: - ~GLConnection(); - - static GLConnection* create(); - - GLXFBConfig* chooseFBConfig(int screen, const int *attrib_list, int *nelements) - { - return m_glXChooseFBConfig(m_display, screen, attrib_list, nelements); - } - - GLXContext createNewContext(GLXFBConfig config, int renderType, GLXContext shareList, Bool direct) - { - return m_glXCreateNewContext(m_display, config, renderType, shareList, direct); - } - - GLXPbuffer createPbuffer(GLXFBConfig config, const int *attribList) - { - return m_glXCreatePbuffer(m_display, config, attribList); - } - - void destroyPbuffer(GLXPbuffer pbuf) - { - m_glXDestroyPbuffer(m_display, pbuf); - } - - Bool makeCurrent(GLXDrawable drawable, GLXContext ctx) - { - return m_glXMakeCurrent(m_display, drawable, ctx); - } - - void destroyContext(GLXContext ctx) - { - m_glXDestroyContext(m_display, ctx); - } - - GLXContext getCurrentContext() - { - return m_glXGetCurrentContext(); - } - - private: - Display* m_display; - void* m_libGL; - PFNGLXCHOOSEFBCONFIGPROC m_glXChooseFBConfig; - PFNGLXCREATENEWCONTEXTPROC m_glXCreateNewContext; - PFNGLXCREATEPBUFFERPROC m_glXCreatePbuffer; - PFNGLXDESTROYPBUFFERPROC m_glXDestroyPbuffer; - typedef Bool (* PFNGLXMAKECURRENTPROC)(Display* dpy, GLXDrawable drawable, GLXContext ctx); - PFNGLXMAKECURRENTPROC m_glXMakeCurrent; - typedef void (* PFNGLXDESTROYCONTEXTPROC)(Display* dpy, GLXContext ctx); - PFNGLXDESTROYCONTEXTPROC m_glXDestroyContext; - typedef GLXContext (* PFNGLXGETCURRENTCONTEXTPROC)(void); - PFNGLXGETCURRENTCONTEXTPROC m_glXGetCurrentContext; - - GLConnection(Display* display, - void* libGL, - PFNGLXCHOOSEFBCONFIGPROC chooseFBConfig, - PFNGLXCREATENEWCONTEXTPROC createNewContext, - PFNGLXCREATEPBUFFERPROC createPbuffer, - PFNGLXDESTROYPBUFFERPROC destroyPbuffer, - PFNGLXMAKECURRENTPROC makeCurrent, - PFNGLXDESTROYCONTEXTPROC destroyContext, - PFNGLXGETCURRENTCONTEXTPROC getCurrentContext) - : m_libGL(libGL) - , m_display(display) - , m_glXChooseFBConfig(chooseFBConfig) - , m_glXCreateNewContext(createNewContext) - , m_glXCreatePbuffer(createPbuffer) - , m_glXDestroyPbuffer(destroyPbuffer) - , m_glXMakeCurrent(makeCurrent) - , m_glXDestroyContext(destroyContext) - , m_glXGetCurrentContext(getCurrentContext) - { - } - }; - - static GLConnection* s_gl; -#else - #error Must port GraphicsContext3D to your platform -#endif -}; - -bool GraphicsContext3DInternal::s_initializedGLEW = false; - -#if OS(LINUX) -GraphicsContext3DInternal::GLConnection* GraphicsContext3DInternal::s_gl = 0; - -GraphicsContext3DInternal::GLConnection* GraphicsContext3DInternal::GLConnection::create() -{ - Display* dpy = XOpenDisplay(0); - if (!dpy) { - printf("GraphicsContext3D: error opening X display\n"); - return 0; - } - - // We use RTLD_GLOBAL semantics so that GLEW initialization works; - // GLEW expects to be able to open the current process's handle - // and do dlsym's of GL entry points from there. - void* libGL = dlopen("libGL.so.1", RTLD_LAZY | RTLD_GLOBAL); - if (!libGL) { - XCloseDisplay(dpy); - printf("GraphicsContext3D: error opening libGL.so.1: %s\n", dlerror()); - return 0; - } - - PFNGLXCHOOSEFBCONFIGPROC chooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC) dlsym(libGL, "glXChooseFBConfig"); - PFNGLXCREATENEWCONTEXTPROC createNewContext = (PFNGLXCREATENEWCONTEXTPROC) dlsym(libGL, "glXCreateNewContext"); - PFNGLXCREATEPBUFFERPROC createPbuffer = (PFNGLXCREATEPBUFFERPROC) dlsym(libGL, "glXCreatePbuffer"); - PFNGLXDESTROYPBUFFERPROC destroyPbuffer = (PFNGLXDESTROYPBUFFERPROC) dlsym(libGL, "glXDestroyPbuffer"); - PFNGLXMAKECURRENTPROC makeCurrent = (PFNGLXMAKECURRENTPROC) dlsym(libGL, "glXMakeCurrent"); - PFNGLXDESTROYCONTEXTPROC destroyContext = (PFNGLXDESTROYCONTEXTPROC) dlsym(libGL, "glXDestroyContext"); - PFNGLXGETCURRENTCONTEXTPROC getCurrentContext = (PFNGLXGETCURRENTCONTEXTPROC) dlsym(libGL, "glXGetCurrentContext"); - if (!chooseFBConfig || !createNewContext || !createPbuffer - || !destroyPbuffer || !makeCurrent || !destroyContext - || !getCurrentContext) { - XCloseDisplay(dpy); - dlclose(libGL); - printf("GraphicsContext3D: error looking up bootstrapping entry points\n"); - return 0; - } - return new GLConnection(dpy, - libGL, - chooseFBConfig, - createNewContext, - createPbuffer, - destroyPbuffer, - makeCurrent, - destroyContext, - getCurrentContext); -} - -GraphicsContext3DInternal::GLConnection::~GLConnection() -{ - XCloseDisplay(m_display); - dlclose(m_libGL); -} - -#endif // OS(LINUX) - -GraphicsContext3DInternal::VertexAttribPointerState::VertexAttribPointerState() - : enabled(false) - , buffer(0) - , indx(0) - , size(0) - , type(0) - , normalized(false) - , stride(0) - , offset(0) -{ -} - -GraphicsContext3DInternal::GraphicsContext3DInternal(GraphicsContext3D::Attributes attrs) - : m_attrs(attrs) - , m_texture(0) - , m_fbo(0) - , m_depthBuffer(0) - , m_boundFBO(0) -#ifdef FLIP_FRAMEBUFFER_VERTICALLY - , m_scanline(0) -#endif - , m_boundArrayBuffer(0) -#if PLATFORM(SKIA) - , m_resizingBitmap(0) -#endif -#if OS(WINDOWS) - , m_canvasWindow(0) - , m_canvasDC(0) - , m_contextObj(0) -#elif PLATFORM(CG) - , m_pbuffer(0) - , m_contextObj(0) - , m_renderOutput(0) -#elif OS(LINUX) - , m_contextObj(0) - , m_pbuffer(0) -#else -#error Must port to your platform -#endif -{ - // FIXME: we need to take into account the user's requested - // context creation attributes, in particular stencil and - // antialias, and determine which could and could not be honored - // based on the capabilities of the OpenGL implementation. - m_attrs.alpha = true; - m_attrs.depth = true; - m_attrs.stencil = false; - m_attrs.antialias = false; - m_attrs.premultipliedAlpha = true; - -#if OS(WINDOWS) - WNDCLASS wc; - if (!GetClassInfo(GetModuleHandle(0), L"CANVASGL", &wc)) { - ZeroMemory(&wc, sizeof(WNDCLASS)); - wc.style = CS_OWNDC; - wc.hInstance = GetModuleHandle(0); - wc.lpfnWndProc = DefWindowProc; - wc.lpszClassName = L"CANVASGL"; - - if (!RegisterClass(&wc)) { - printf("GraphicsContext3D: RegisterClass failed\n"); - return; - } - } - - m_canvasWindow = CreateWindow(L"CANVASGL", L"CANVASGL", - WS_CAPTION, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, 0, 0, GetModuleHandle(0), 0); - if (!m_canvasWindow) { - printf("GraphicsContext3DInternal: CreateWindow failed\n"); - return; - } - - // get the device context - m_canvasDC = GetDC(m_canvasWindow); - if (!m_canvasDC) { - printf("GraphicsContext3DInternal: GetDC failed\n"); - return; - } - - // find default pixel format - PIXELFORMATDESCRIPTOR pfd; - ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL -#ifdef RENDER_TO_DEBUGGING_WINDOW - | PFD_DOUBLEBUFFER -#endif // RENDER_TO_DEBUGGING_WINDOW - ; - int pixelformat = ChoosePixelFormat(m_canvasDC, &pfd); - - // set the pixel format for the dc - if (!SetPixelFormat(m_canvasDC, pixelformat, &pfd)) { - printf("GraphicsContext3D: SetPixelFormat failed\n"); - return; - } - - // create rendering context - m_contextObj = wglCreateContext(m_canvasDC); - if (!m_contextObj) { - printf("GraphicsContext3D: wglCreateContext failed\n"); - return; - } - - if (!wglMakeCurrent(m_canvasDC, m_contextObj)) { - printf("GraphicsContext3D: wglMakeCurrent failed\n"); - return; - } - -#ifdef RENDER_TO_DEBUGGING_WINDOW - typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); - PFNWGLSWAPINTERVALEXTPROC setSwapInterval = 0; - setSwapInterval = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT"); - if (setSwapInterval) - setSwapInterval(1); -#endif // RENDER_TO_DEBUGGING_WINDOW - -#elif PLATFORM(CG) - // Create a 1x1 pbuffer and associated context to bootstrap things - CGLPixelFormatAttribute attribs[] = { - (CGLPixelFormatAttribute) kCGLPFAPBuffer, - (CGLPixelFormatAttribute) 0 - }; - CGLPixelFormatObj pixelFormat; - GLint numPixelFormats; - if (CGLChoosePixelFormat(attribs, &pixelFormat, &numPixelFormats) != kCGLNoError) { - printf("GraphicsContext3D: error choosing pixel format\n"); - return; - } - if (!pixelFormat) { - printf("GraphicsContext3D: no pixel format selected\n"); - return; - } - CGLContextObj context; - CGLError res = CGLCreateContext(pixelFormat, 0, &context); - CGLDestroyPixelFormat(pixelFormat); - if (res != kCGLNoError) { - printf("GraphicsContext3D: error creating context\n"); - return; - } - CGLPBufferObj pbuffer; - if (CGLCreatePBuffer(1, 1, GL_TEXTURE_2D, GL_RGBA, 0, &pbuffer) != kCGLNoError) { - CGLDestroyContext(context); - printf("GraphicsContext3D: error creating pbuffer\n"); - return; - } - if (CGLSetPBuffer(context, pbuffer, 0, 0, 0) != kCGLNoError) { - CGLDestroyContext(context); - CGLDestroyPBuffer(pbuffer); - printf("GraphicsContext3D: error attaching pbuffer to context\n"); - return; - } - if (CGLSetCurrentContext(context) != kCGLNoError) { - CGLDestroyContext(context); - CGLDestroyPBuffer(pbuffer); - printf("GraphicsContext3D: error making context current\n"); - return; - } - m_pbuffer = pbuffer; - m_contextObj = context; -#elif OS(LINUX) - if (!s_gl) { - s_gl = GLConnection::create(); - if (!s_gl) - return; - } - - int configAttrs[] = { - GLX_DRAWABLE_TYPE, - GLX_PBUFFER_BIT, - GLX_RENDER_TYPE, - GLX_RGBA_BIT, - GLX_DOUBLEBUFFER, - 0, - 0 - }; - int nelements = 0; - GLXFBConfig* config = s_gl->chooseFBConfig(0, configAttrs, &nelements); - if (!config) { - printf("GraphicsContext3D: glXChooseFBConfig failed\n"); - return; - } - if (!nelements) { - printf("GraphicsContext3D: glXChooseFBConfig returned 0 elements\n"); - XFree(config); - return; - } - GLXContext context = s_gl->createNewContext(config[0], GLX_RGBA_TYPE, 0, True); - if (!context) { - printf("GraphicsContext3D: glXCreateNewContext failed\n"); - XFree(config); - return; - } - int pbufferAttrs[] = { - GLX_PBUFFER_WIDTH, - 1, - GLX_PBUFFER_HEIGHT, - 1, - 0 - }; - GLXPbuffer pbuffer = s_gl->createPbuffer(config[0], pbufferAttrs); - XFree(config); - if (!pbuffer) { - printf("GraphicsContext3D: glxCreatePbuffer failed\n"); - return; - } - if (!s_gl->makeCurrent(pbuffer, context)) { - printf("GraphicsContext3D: glXMakeCurrent failed\n"); - return; - } - m_contextObj = context; - m_pbuffer = pbuffer; -#else -#error Must port to your platform -#endif - - if (!s_initializedGLEW) { - // Initialize GLEW and check for GL 2.0 support by the drivers. - GLenum glewInitResult = glewInit(); - if (glewInitResult != GLEW_OK) { - printf("GraphicsContext3D: GLEW initialization failed\n"); - return; - } - if (!glewIsSupported("GL_VERSION_2_0")) { - printf("GraphicsContext3D: OpenGL 2.0 not supported\n"); - return; - } - s_initializedGLEW = true; - } -} - -GraphicsContext3DInternal::~GraphicsContext3DInternal() -{ - makeContextCurrent(); -#ifndef RENDER_TO_DEBUGGING_WINDOW - glDeleteRenderbuffersEXT(1, &m_depthBuffer); - glDeleteTextures(1, &m_texture); -#ifdef FLIP_FRAMEBUFFER_VERTICALLY - if (m_scanline) - delete[] m_scanline; -#endif - glDeleteFramebuffersEXT(1, &m_fbo); -#endif // !RENDER_TO_DEBUGGING_WINDOW -#if PLATFORM(SKIA) - if (m_resizingBitmap) - delete m_resizingBitmap; -#endif -#if OS(WINDOWS) - wglMakeCurrent(0, 0); - wglDeleteContext(m_contextObj); - ReleaseDC(m_canvasWindow, m_canvasDC); - DestroyWindow(m_canvasWindow); -#elif PLATFORM(CG) - CGLSetCurrentContext(0); - CGLDestroyContext(m_contextObj); - CGLDestroyPBuffer(m_pbuffer); - if (m_renderOutput) - delete[] m_renderOutput; -#elif OS(LINUX) - s_gl->makeCurrent(0, 0); - s_gl->destroyContext(m_contextObj); - s_gl->destroyPbuffer(m_pbuffer); -#else -#error Must port to your platform -#endif - m_contextObj = 0; -} - -bool GraphicsContext3DInternal::makeContextCurrent() -{ -#if OS(WINDOWS) - if (wglGetCurrentContext() != m_contextObj) - if (wglMakeCurrent(m_canvasDC, m_contextObj)) - return true; -#elif PLATFORM(CG) - if (CGLGetCurrentContext() != m_contextObj) - if (CGLSetCurrentContext(m_contextObj) == kCGLNoError) - return true; -#elif OS(LINUX) - if (s_gl->getCurrentContext() != m_contextObj) - if (s_gl->makeCurrent(m_pbuffer, m_contextObj)) - return true; -#else -#error Must port to your platform -#endif - return false; -} - -PlatformGraphicsContext3D GraphicsContext3DInternal::platformGraphicsContext3D() const -{ - return m_contextObj; -} - -Platform3DObject GraphicsContext3DInternal::platformTexture() const -{ - return m_texture; -} - -static int createTextureObject(GLenum target) -{ - GLuint texture = 0; - glGenTextures(1, &texture); - glBindTexture(target, texture); - glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - return texture; -} - -void GraphicsContext3DInternal::reshape(int width, int height) -{ -#ifdef RENDER_TO_DEBUGGING_WINDOW - SetWindowPos(m_canvasWindow, HWND_TOP, 0, 0, width, height, - SWP_NOMOVE); - ShowWindow(m_canvasWindow, SW_SHOW); -#endif - - m_cachedWidth = width; - m_cachedHeight = height; - makeContextCurrent(); - -#ifndef RENDER_TO_DEBUGGING_WINDOW -#ifdef USE_TEXTURE_RECTANGLE_FOR_FRAMEBUFFER - // GL_TEXTURE_RECTANGLE_ARB is the best supported render target on Mac OS X - GLenum target = GL_TEXTURE_RECTANGLE_ARB; -#else - GLenum target = GL_TEXTURE_2D; -#endif - if (!m_texture) { - // Generate the texture object - m_texture = createTextureObject(target); - // Generate the framebuffer object - glGenFramebuffersEXT(1, &m_fbo); - // Generate the depth buffer - glGenRenderbuffersEXT(1, &m_depthBuffer); - } - - // Reallocate the color and depth buffers - glBindTexture(target, m_texture); - glTexImage2D(target, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glBindTexture(target, 0); - - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - m_boundFBO = m_fbo; - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthBuffer); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); - - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target, m_texture, 0); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthBuffer); - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { - printf("GraphicsContext3D: framebuffer was incomplete\n"); - - // FIXME: cleanup. - notImplemented(); - } -#endif // RENDER_TO_DEBUGGING_WINDOW - -#ifdef FLIP_FRAMEBUFFER_VERTICALLY - if (m_scanline) { - delete[] m_scanline; - m_scanline = 0; - } - m_scanline = new unsigned char[width * 4]; -#endif // FLIP_FRAMEBUFFER_VERTICALLY - - glClear(GL_COLOR_BUFFER_BIT); - -#if PLATFORM(CG) - // Need to reallocate the client-side backing store. - // FIXME: make this more efficient. - if (m_renderOutput) { - delete[] m_renderOutput; - m_renderOutput = 0; - } - int rowBytes = width * 4; - m_renderOutput = new unsigned char[height * rowBytes]; -#endif // PLATFORM(CG) -} - -#ifdef FLIP_FRAMEBUFFER_VERTICALLY -void GraphicsContext3DInternal::flipVertically(unsigned char* framebuffer, - unsigned int width, - unsigned int height) -{ - unsigned char* scanline = m_scanline; - if (!scanline) - return; - unsigned int rowBytes = width * 4; - unsigned int count = height / 2; - for (unsigned int i = 0; i < count; i++) { - unsigned char* rowA = framebuffer + i * rowBytes; - unsigned char* rowB = framebuffer + (height - i - 1) * rowBytes; - // FIXME: this is where the multiplication of the alpha - // channel into the color buffer will need to occur if the - // user specifies the "premultiplyAlpha" flag in the context - // creation attributes. - memcpy(scanline, rowB, rowBytes); - memcpy(rowB, rowA, rowBytes); - memcpy(rowA, scanline, rowBytes); - } -} -#endif - -void GraphicsContext3DInternal::beginPaint(WebGLRenderingContext* context) -{ - makeContextCurrent(); - -#ifdef RENDER_TO_DEBUGGING_WINDOW - SwapBuffers(m_canvasDC); -#else - // Earlier versions of this code used the GPU to flip the - // framebuffer vertically before reading it back for compositing - // via software. This code was quite complicated, used a lot of - // GPU memory, and didn't provide an obvious speedup. Since this - // vertical flip is only a temporary solution anyway until Chrome - // is fully GPU composited, it wasn't worth the complexity. - - HTMLCanvasElement* canvas = context->canvas(); - ImageBuffer* imageBuffer = canvas->buffer(); - unsigned char* pixels = 0; - bool mustRestoreFBO = (m_boundFBO != m_fbo); - if (mustRestoreFBO) - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); -#if PLATFORM(SKIA) - const SkBitmap* canvasBitmap = imageBuffer->context()->platformContext()->bitmap(); - const SkBitmap* readbackBitmap = 0; - ASSERT(canvasBitmap->config() == SkBitmap::kARGB_8888_Config); - if (canvasBitmap->width() == m_cachedWidth && canvasBitmap->height() == m_cachedHeight) { - // This is the fastest and most common case. We read back - // directly into the canvas's backing store. - readbackBitmap = canvasBitmap; - if (m_resizingBitmap) { - delete m_resizingBitmap; - m_resizingBitmap = 0; - } - } else { - // We need to allocate a temporary bitmap for reading back the - // pixel data. We will then use Skia to rescale this bitmap to - // the size of the canvas's backing store. - if (m_resizingBitmap && (m_resizingBitmap->width() != m_cachedWidth || m_resizingBitmap->height() != m_cachedHeight)) { - delete m_resizingBitmap; - m_resizingBitmap = 0; - } - if (!m_resizingBitmap) { - m_resizingBitmap = new SkBitmap(); - m_resizingBitmap->setConfig(SkBitmap::kARGB_8888_Config, - m_cachedWidth, - m_cachedHeight); - if (!m_resizingBitmap->allocPixels()) { - delete m_resizingBitmap; - m_resizingBitmap = 0; - return; - } - } - readbackBitmap = m_resizingBitmap; - } - - // Read back the frame buffer. - SkAutoLockPixels bitmapLock(*readbackBitmap); - pixels = static_cast<unsigned char*>(readbackBitmap->getPixels()); - glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_BGRA, GL_UNSIGNED_BYTE, pixels); -#elif PLATFORM(CG) - if (m_renderOutput) { - pixels = m_renderOutput; - glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels); - } -#else -#error Must port to your platform -#endif - - if (mustRestoreFBO) - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); - -#ifdef FLIP_FRAMEBUFFER_VERTICALLY - if (pixels) - flipVertically(pixels, m_cachedWidth, m_cachedHeight); -#endif - -#if PLATFORM(SKIA) - if (m_resizingBitmap) { - // We need to draw the resizing bitmap into the canvas's backing store. - SkCanvas canvas(*canvasBitmap); - SkRect dst; - dst.set(0, 0, canvasBitmap->width(), canvasBitmap->height()); - canvas.drawBitmapRect(*m_resizingBitmap, 0, dst); - } -#elif PLATFORM(CG) - if (m_renderOutput) { - int rowBytes = m_cachedWidth * 4; - CGDataProviderRef dataProvider = CGDataProviderCreateWithData(0, m_renderOutput, rowBytes * m_cachedHeight, 0); - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGImageRef cgImage = CGImageCreate(m_cachedWidth, - m_cachedHeight, - 8, - 32, - rowBytes, - colorSpace, - kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host, - dataProvider, - 0, - false, - kCGRenderingIntentDefault); - // CSS styling may cause the canvas's content to be resized on - // the page. Go back to the Canvas to figure out the correct - // width and height to draw. - CGRect rect = CGRectMake(0, 0, - context->canvas()->width(), - context->canvas()->height()); - // We want to completely overwrite the previous frame's - // rendering results. - CGContextSetBlendMode(imageBuffer->context()->platformContext(), - kCGBlendModeCopy); - CGContextSetInterpolationQuality(imageBuffer->context()->platformContext(), - kCGInterpolationNone); - CGContextDrawImage(imageBuffer->context()->platformContext(), - rect, cgImage); - CGImageRelease(cgImage); - CGColorSpaceRelease(colorSpace); - CGDataProviderRelease(dataProvider); - } -#else -#error Must port to your platform -#endif - -#endif // RENDER_TO_DEBUGGING_WINDOW -} - -void GraphicsContext3DInternal::activeTexture(unsigned long texture) -{ - // FIXME: query number of textures available. - if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0+32) - // FIXME: raise exception. - return; - - makeContextCurrent(); - glActiveTexture(texture); -} - -void GraphicsContext3DInternal::bindBuffer(unsigned long target, - WebGLBuffer* buffer) -{ - makeContextCurrent(); - GLuint bufID = EXTRACT(buffer); - if (target == GL_ARRAY_BUFFER) - m_boundArrayBuffer = bufID; - glBindBuffer(target, bufID); -} - -void GraphicsContext3DInternal::bindFramebuffer(unsigned long target, - WebGLFramebuffer* framebuffer) -{ - makeContextCurrent(); - GLuint id = EXTRACT(framebuffer); - if (!id) - id = m_fbo; - glBindFramebufferEXT(target, id); - m_boundFBO = id; -} - -// If we didn't have to hack GL_TEXTURE_WRAP_R for cube maps, -// we could just use: -// GL_SAME_METHOD_2_X2(BindTexture, bindTexture, unsigned long, WebGLTexture*) -void GraphicsContext3DInternal::bindTexture(unsigned long target, - WebGLTexture* texture) -{ - makeContextCurrent(); - unsigned int textureObject = EXTRACT(texture); - - glBindTexture(target, textureObject); - - // FIXME: GL_TEXTURE_WRAP_R isn't exposed in the OpenGL ES 2.0 - // API. On desktop OpenGL implementations it seems necessary to - // set this wrap mode to GL_CLAMP_TO_EDGE to get correct behavior - // of cube maps. - if (texture) { - if (target == GL_TEXTURE_CUBE_MAP) { - if (!texture->isCubeMapRWrapModeInitialized()) { - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - texture->setCubeMapRWrapModeInitialized(true); - } - } else - texture->setCubeMapRWrapModeInitialized(false); - } -} - -void GraphicsContext3DInternal::bufferDataImpl(unsigned long target, int size, const void* data, unsigned long usage) -{ - makeContextCurrent(); - // FIXME: make this verification more efficient. - GLint binding = 0; - GLenum binding_target = GL_ARRAY_BUFFER_BINDING; - if (target == GL_ELEMENT_ARRAY_BUFFER) - binding_target = GL_ELEMENT_ARRAY_BUFFER_BINDING; - glGetIntegerv(binding_target, &binding); - if (binding <= 0) { - // FIXME: raise exception. - // LogMessagef(("bufferData: no buffer bound")); - return; - } - - glBufferData(target, - size, - data, - usage); -} - -void GraphicsContext3DInternal::disableVertexAttribArray(unsigned long index) -{ - makeContextCurrent(); - if (index < NumTrackedPointerStates) - m_vertexAttribPointerState[index].enabled = false; - glDisableVertexAttribArray(index); -} - -void GraphicsContext3DInternal::enableVertexAttribArray(unsigned long index) -{ - makeContextCurrent(); - if (index < NumTrackedPointerStates) - m_vertexAttribPointerState[index].enabled = true; - glEnableVertexAttribArray(index); -} - -unsigned long GraphicsContext3DInternal::getError() -{ - if (m_syntheticErrors.size() > 0) { - ListHashSet<unsigned long>::iterator iter = m_syntheticErrors.begin(); - unsigned long err = *iter; - m_syntheticErrors.remove(iter); - return err; - } - - makeContextCurrent(); - return glGetError(); -} - -GraphicsContext3D::Attributes GraphicsContext3DInternal::getContextAttributes() -{ - return m_attrs; -} - -void GraphicsContext3DInternal::vertexAttribPointer(unsigned long indx, int size, int type, bool normalized, - unsigned long stride, unsigned long offset) -{ - makeContextCurrent(); - - if (m_boundArrayBuffer <= 0) { - // FIXME: raise exception. - // LogMessagef(("bufferData: no buffer bound")); - return; - } - - if (indx < NumTrackedPointerStates) { - VertexAttribPointerState& state = m_vertexAttribPointerState[indx]; - state.buffer = m_boundArrayBuffer; - state.indx = indx; - state.size = size; - state.type = type; - state.normalized = normalized; - state.stride = stride; - state.offset = offset; - } - - glVertexAttribPointer(indx, size, type, normalized, stride, - reinterpret_cast<void*>(static_cast<intptr_t>(offset))); -} - -void GraphicsContext3DInternal::viewportImpl(long x, long y, unsigned long width, unsigned long height) -{ - glViewport(x, y, width, height); -} - -void GraphicsContext3DInternal::synthesizeGLError(unsigned long error) -{ - m_syntheticErrors.add(error); -} - -// GraphicsContext3D ----------------------------------------------------- - -/* Helper macros for when we're just wrapping a gl method, so that - * we can avoid having to type this 500 times. Note that these MUST - * NOT BE USED if we need to check any of the parameters. - */ - -#define GL_SAME_METHOD_0(glname, name) \ -void GraphicsContext3D::name() \ -{ \ - makeContextCurrent(); \ - gl##glname(); \ -} - -#define GL_SAME_METHOD_1(glname, name, t1) \ -void GraphicsContext3D::name(t1 a1) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1); \ -} - -#define GL_SAME_METHOD_1_X(glname, name, t1) \ -void GraphicsContext3D::name(t1 a1) \ -{ \ - makeContextCurrent(); \ - gl##glname(EXTRACT(a1)); \ -} - -#define GL_SAME_METHOD_2(glname, name, t1, t2) \ -void GraphicsContext3D::name(t1 a1, t2 a2) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, a2); \ -} - -#define GL_SAME_METHOD_2_X12(glname, name, t1, t2) \ -void GraphicsContext3D::name(t1 a1, t2 a2) \ -{ \ - makeContextCurrent(); \ - gl##glname(EXTRACT(a1), EXTRACT(a2)); \ -} - -#define GL_SAME_METHOD_2_X2(glname, name, t1, t2) \ -void GraphicsContext3D::name(t1 a1, t2 a2) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, EXTRACT(a2)); \ -} - -#define GL_SAME_METHOD_3(glname, name, t1, t2, t3) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, a2, a3); \ -} - -#define GL_SAME_METHOD_3_X12(glname, name, t1, t2, t3) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \ -{ \ - makeContextCurrent(); \ - gl##glname(EXTRACT(a1), EXTRACT(a2), a3); \ -} - -#define GL_SAME_METHOD_3_X2(glname, name, t1, t2, t3) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, EXTRACT(a2), a3); \ -} - -#define GL_SAME_METHOD_4(glname, name, t1, t2, t3, t4) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, a2, a3, a4); \ -} - -#define GL_SAME_METHOD_4_X4(glname, name, t1, t2, t3, t4) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, a2, a3, EXTRACT(a4)); \ -} - -#define GL_SAME_METHOD_5(glname, name, t1, t2, t3, t4, t5) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, a2, a3, a4, a5); \ -} - -#define GL_SAME_METHOD_5_X4(glname, name, t1, t2, t3, t4, t5) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, a2, a3, EXTRACT(a4), a5); \ -} - -#define GL_SAME_METHOD_6(glname, name, t1, t2, t3, t4, t5, t6) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, a2, a3, a4, a5, a6); \ -} - -#define GL_SAME_METHOD_8(glname, name, t1, t2, t3, t4, t5, t6, t7, t8) \ -void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) \ -{ \ - makeContextCurrent(); \ - gl##glname(a1, a2, a3, a4, a5, a6, a7, a8); \ -} - -PassOwnPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attrs) -{ - PassOwnPtr<GraphicsContext3D> context = new GraphicsContext3D(attrs); - // FIXME: add error checking - return context; -} - -GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs) - : m_currentWidth(0) - , m_currentHeight(0) - , m_internal(new GraphicsContext3DInternal(attrs)) -{ -} - -GraphicsContext3D::~GraphicsContext3D() -{ -} - -PlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D() const -{ - return m_internal->platformGraphicsContext3D(); -} - -Platform3DObject GraphicsContext3D::platformTexture() const -{ - return m_internal->platformTexture(); -} - -void GraphicsContext3D::makeContextCurrent() -{ - m_internal->makeContextCurrent(); -} - -void GraphicsContext3D::reshape(int width, int height) -{ - if (width == m_currentWidth && height == m_currentHeight) - return; - - m_currentWidth = width; - m_currentHeight = height; - - m_internal->reshape(width, height); -} - -void GraphicsContext3D::beginPaint(WebGLRenderingContext* context) -{ - m_internal->beginPaint(context); -} - -void GraphicsContext3D::endPaint() -{ -} - -int GraphicsContext3D::sizeInBytes(int type) -{ - switch (type) { - case GL_BYTE: - return sizeof(GLbyte); - case GL_UNSIGNED_BYTE: - return sizeof(GLubyte); - case GL_SHORT: - return sizeof(GLshort); - case GL_UNSIGNED_SHORT: - return sizeof(GLushort); - case GL_INT: - return sizeof(GLint); - case GL_UNSIGNED_INT: - return sizeof(GLuint); - case GL_FLOAT: - return sizeof(GLfloat); - default: // FIXME: default cases are discouraged in WebKit. - return 0; - } -} - -unsigned GraphicsContext3D::createBuffer() -{ - makeContextCurrent(); - GLuint o; - glGenBuffers(1, &o); - return o; -} - -unsigned GraphicsContext3D::createFramebuffer() -{ - makeContextCurrent(); - GLuint o = 0; - glGenFramebuffersEXT(1, &o); - return o; -} - -unsigned GraphicsContext3D::createProgram() -{ - makeContextCurrent(); - return glCreateProgram(); -} - -unsigned GraphicsContext3D::createRenderbuffer() -{ - makeContextCurrent(); - GLuint o; - glGenRenderbuffersEXT(1, &o); - return o; -} - -unsigned GraphicsContext3D::createShader(unsigned long type) -{ - makeContextCurrent(); - return glCreateShader((type == FRAGMENT_SHADER) ? GL_FRAGMENT_SHADER : GL_VERTEX_SHADER); -} - -unsigned GraphicsContext3D::createTexture() -{ - makeContextCurrent(); - GLuint o; - glGenTextures(1, &o); - return o; -} - -void GraphicsContext3D::deleteBuffer(unsigned buffer) -{ - makeContextCurrent(); - glDeleteBuffers(1, &buffer); -} - -void GraphicsContext3D::deleteFramebuffer(unsigned framebuffer) -{ - makeContextCurrent(); - glDeleteFramebuffersEXT(1, &framebuffer); -} - -void GraphicsContext3D::deleteProgram(unsigned program) -{ - makeContextCurrent(); - glDeleteProgram(program); -} - -void GraphicsContext3D::deleteRenderbuffer(unsigned renderbuffer) -{ - makeContextCurrent(); - glDeleteRenderbuffersEXT(1, &renderbuffer); -} - -void GraphicsContext3D::deleteShader(unsigned shader) -{ - makeContextCurrent(); - glDeleteShader(shader); -} - -void GraphicsContext3D::deleteTexture(unsigned texture) -{ - makeContextCurrent(); - glDeleteTextures(1, &texture); -} - -void GraphicsContext3D::activeTexture(unsigned long texture) -{ - m_internal->activeTexture(texture); -} - -GL_SAME_METHOD_2_X12(AttachShader, attachShader, WebGLProgram*, WebGLShader*) - -void GraphicsContext3D::bindAttribLocation(WebGLProgram* program, - unsigned long index, - const String& name) -{ - if (!program) - return; - makeContextCurrent(); - glBindAttribLocation(EXTRACT(program), index, name.utf8().data()); -} - -void GraphicsContext3D::bindBuffer(unsigned long target, - WebGLBuffer* buffer) -{ - m_internal->bindBuffer(target, buffer); -} - -void GraphicsContext3D::bindFramebuffer(unsigned long target, WebGLFramebuffer* framebuffer) -{ - m_internal->bindFramebuffer(target, framebuffer); -} - -GL_SAME_METHOD_2_X2(BindRenderbufferEXT, bindRenderbuffer, unsigned long, WebGLRenderbuffer*) - -// If we didn't have to hack GL_TEXTURE_WRAP_R for cube maps, -// we could just use: -// GL_SAME_METHOD_2_X2(BindTexture, bindTexture, unsigned long, WebGLTexture*) -void GraphicsContext3D::bindTexture(unsigned long target, - WebGLTexture* texture) -{ - m_internal->bindTexture(target, texture); -} - -GL_SAME_METHOD_4(BlendColor, blendColor, double, double, double, double) - -GL_SAME_METHOD_1(BlendEquation, blendEquation, unsigned long) - -GL_SAME_METHOD_2(BlendEquationSeparate, blendEquationSeparate, unsigned long, unsigned long) - -GL_SAME_METHOD_2(BlendFunc, blendFunc, unsigned long, unsigned long) - -GL_SAME_METHOD_4(BlendFuncSeparate, blendFuncSeparate, unsigned long, unsigned long, unsigned long, unsigned long) - -void GraphicsContext3D::bufferData(unsigned long target, int size, unsigned long usage) -{ - m_internal->bufferDataImpl(target, size, 0, usage); -} - -void GraphicsContext3D::bufferData(unsigned long target, WebGLArray* array, unsigned long usage) -{ - m_internal->bufferDataImpl(target, array->byteLength(), array->baseAddress(), usage); -} - -void GraphicsContext3D::bufferSubData(unsigned long target, long offset, WebGLArray* array) -{ - if (!array || !array->length()) - return; - - makeContextCurrent(); - // FIXME: make this verification more efficient. - GLint binding = 0; - GLenum binding_target = GL_ARRAY_BUFFER_BINDING; - if (target == GL_ELEMENT_ARRAY_BUFFER) - binding_target = GL_ELEMENT_ARRAY_BUFFER_BINDING; - glGetIntegerv(binding_target, &binding); - if (binding <= 0) { - // FIXME: raise exception. - // LogMessagef(("bufferSubData: no buffer bound")); - return; - } - glBufferSubData(target, offset, array->byteLength(), array->baseAddress()); -} - -unsigned long GraphicsContext3D::checkFramebufferStatus(unsigned long target) -{ - makeContextCurrent(); - return glCheckFramebufferStatusEXT(target); -} - -GL_SAME_METHOD_1(Clear, clear, unsigned long) - -GL_SAME_METHOD_4(ClearColor, clearColor, double, double, double, double) - -GL_SAME_METHOD_1(ClearDepth, clearDepth, double) - -GL_SAME_METHOD_1(ClearStencil, clearStencil, long) - -GL_SAME_METHOD_4(ColorMask, colorMask, bool, bool, bool, bool) - -GL_SAME_METHOD_1_X(CompileShader, compileShader, WebGLShader*) - -GL_SAME_METHOD_8(CopyTexImage2D, copyTexImage2D, unsigned long, long, unsigned long, long, long, unsigned long, unsigned long, long) - -GL_SAME_METHOD_8(CopyTexSubImage2D, copyTexSubImage2D, unsigned long, long, long, long, long, long, unsigned long, unsigned long) - -GL_SAME_METHOD_1(CullFace, cullFace, unsigned long) - -GL_SAME_METHOD_1(DepthFunc, depthFunc, unsigned long) - -GL_SAME_METHOD_1(DepthMask, depthMask, bool) - -GL_SAME_METHOD_2(DepthRange, depthRange, double, double) - -void GraphicsContext3D::detachShader(WebGLProgram* program, WebGLShader* shader) -{ - if (!program || !shader) - return; - - makeContextCurrent(); - glDetachShader(EXTRACT(program), EXTRACT(shader)); -} - -GL_SAME_METHOD_1(Disable, disable, unsigned long) - -void GraphicsContext3D::disableVertexAttribArray(unsigned long index) -{ - m_internal->disableVertexAttribArray(index); -} - -void GraphicsContext3D::drawArrays(unsigned long mode, long first, long count) -{ - switch (mode) { - case GL_TRIANGLES: - case GL_TRIANGLE_STRIP: - case GL_TRIANGLE_FAN: - case GL_POINTS: - case GL_LINE_STRIP: - case GL_LINE_LOOP: - case GL_LINES: - break; - default: // FIXME: default cases are discouraged in WebKit. - // FIXME: output log message, raise exception. - // LogMessage(NS_LITERAL_CSTRING("drawArrays: invalid mode")); - // return NS_ERROR_DOM_SYNTAX_ERR; - return; - } - - if (first+count < first || first+count < count) { - // FIXME: output log message, raise exception. - // LogMessage(NS_LITERAL_CSTRING("drawArrays: overflow in first+count")); - // return NS_ERROR_INVALID_ARG; - return; - } - - // FIXME: validate against currently bound buffer. - // if (!ValidateBuffers(first+count)) - // return NS_ERROR_INVALID_ARG; - - makeContextCurrent(); - glDrawArrays(mode, first, count); -} - -void GraphicsContext3D::drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset) -{ - makeContextCurrent(); - // FIXME: make this verification more efficient. - GLint binding = 0; - GLenum binding_target = GL_ELEMENT_ARRAY_BUFFER_BINDING; - glGetIntegerv(binding_target, &binding); - if (binding <= 0) { - // FIXME: raise exception. - // LogMessagef(("bufferData: no buffer bound")); - return; - } - glDrawElements(mode, count, type, - reinterpret_cast<void*>(static_cast<intptr_t>(offset))); -} - -GL_SAME_METHOD_1(Enable, enable, unsigned long) - -void GraphicsContext3D::enableVertexAttribArray(unsigned long index) -{ - m_internal->enableVertexAttribArray(index); -} - -GL_SAME_METHOD_0(Finish, finish) - -GL_SAME_METHOD_0(Flush, flush) - -GL_SAME_METHOD_4_X4(FramebufferRenderbufferEXT, framebufferRenderbuffer, unsigned long, unsigned long, unsigned long, WebGLRenderbuffer*) - -GL_SAME_METHOD_5_X4(FramebufferTexture2DEXT, framebufferTexture2D, unsigned long, unsigned long, unsigned long, WebGLTexture*, long) - -GL_SAME_METHOD_1(FrontFace, frontFace, unsigned long) - -void GraphicsContext3D::generateMipmap(unsigned long target) -{ - makeContextCurrent(); - if (glGenerateMipmapEXT) - glGenerateMipmapEXT(target); - // FIXME: provide alternative code path? This will be unpleasant - // to implement if glGenerateMipmapEXT is not available -- it will - // require a texture readback and re-upload. -} - -bool GraphicsContext3D::getActiveAttrib(WebGLProgram* program, unsigned long index, ActiveInfo& info) -{ - if (!program) { - synthesizeGLError(INVALID_VALUE); - return false; - } - GLint maxNameLength = -1; - glGetProgramiv(EXTRACT(program), GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxNameLength); - if (maxNameLength < 0) - return false; - GLchar* name = 0; - if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) { - synthesizeGLError(OUT_OF_MEMORY); - return false; - } - GLsizei length = 0; - GLint size = -1; - GLenum type = 0; - glGetActiveAttrib(EXTRACT(program), index, maxNameLength, - &length, &size, &type, name); - if (size < 0) { - fastFree(name); - return false; - } - info.name = String(name, length); - info.type = type; - info.size = size; - fastFree(name); - return true; -} - -bool GraphicsContext3D::getActiveUniform(WebGLProgram* program, unsigned long index, ActiveInfo& info) -{ - if (!program) { - synthesizeGLError(INVALID_VALUE); - return false; - } - GLint maxNameLength = -1; - glGetProgramiv(EXTRACT(program), GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength); - if (maxNameLength < 0) - return false; - GLchar* name = 0; - if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) { - synthesizeGLError(OUT_OF_MEMORY); - return false; - } - GLsizei length = 0; - GLint size = -1; - GLenum type = 0; - glGetActiveUniform(EXTRACT(program), index, maxNameLength, - &length, &size, &type, name); - if (size < 0) { - fastFree(name); - return false; - } - info.name = String(name, length); - info.type = type; - info.size = size; - fastFree(name); - return true; -} - -int GraphicsContext3D::getAttribLocation(WebGLProgram* program, const String& name) -{ - if (!program) - return -1; - - makeContextCurrent(); - return glGetAttribLocation(EXTRACT(program), name.utf8().data()); -} - -void GraphicsContext3D::getBooleanv(unsigned long pname, unsigned char* value) -{ - makeContextCurrent(); - glGetBooleanv(pname, value); -} - -void GraphicsContext3D::getBufferParameteriv(unsigned long target, unsigned long pname, int* value) -{ - makeContextCurrent(); - glGetBufferParameteriv(target, pname, value); -} - -GraphicsContext3D::Attributes GraphicsContext3D::getContextAttributes() -{ - return m_internal->getContextAttributes(); -} - -unsigned long GraphicsContext3D::getError() -{ - return m_internal->getError(); -} - -void GraphicsContext3D::getFloatv(unsigned long pname, float* value) -{ - makeContextCurrent(); - glGetFloatv(pname, value); -} - -void GraphicsContext3D::getFramebufferAttachmentParameteriv(unsigned long target, - unsigned long attachment, - unsigned long pname, - int* value) -{ - makeContextCurrent(); - glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, value); -} - -void GraphicsContext3D::getIntegerv(unsigned long pname, int* value) -{ - makeContextCurrent(); - glGetIntegerv(pname, value); -} - -void GraphicsContext3D::getProgramiv(WebGLProgram* program, - unsigned long pname, - int* value) -{ - makeContextCurrent(); - glGetProgramiv(EXTRACT(program), pname, value); -} - -String GraphicsContext3D::getProgramInfoLog(WebGLProgram* program) -{ - makeContextCurrent(); - GLuint programID = EXTRACT(program); - GLint logLength; - glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &logLength); - if (!logLength) - return String(); - GLchar* log = 0; - if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log)) - return String(); - GLsizei returnedLogLength; - glGetProgramInfoLog(programID, logLength, &returnedLogLength, log); - ASSERT(logLength == returnedLogLength + 1); - String res = String(log, returnedLogLength); - fastFree(log); - return res; -} - -void GraphicsContext3D::getRenderbufferParameteriv(unsigned long target, - unsigned long pname, - int* value) -{ - makeContextCurrent(); - glGetRenderbufferParameterivEXT(target, pname, value); -} - -void GraphicsContext3D::getShaderiv(WebGLShader* shader, - unsigned long pname, - int* value) -{ - makeContextCurrent(); - glGetShaderiv(EXTRACT(shader), pname, value); -} - -String GraphicsContext3D::getShaderInfoLog(WebGLShader* shader) -{ - makeContextCurrent(); - GLuint shaderID = EXTRACT(shader); - GLint logLength; - glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLength); - if (!logLength) - return String(); - GLchar* log = 0; - if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log)) - return String(); - GLsizei returnedLogLength; - glGetShaderInfoLog(shaderID, logLength, &returnedLogLength, log); - ASSERT(logLength == returnedLogLength + 1); - String res = String(log, returnedLogLength); - fastFree(log); - return res; -} - -String GraphicsContext3D::getShaderSource(WebGLShader* shader) -{ - makeContextCurrent(); - GLuint shaderID = EXTRACT(shader); - GLint logLength; - glGetShaderiv(shaderID, GL_SHADER_SOURCE_LENGTH, &logLength); - if (!logLength) - return String(); - GLchar* log = 0; - if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log)) - return String(); - GLsizei returnedLogLength; - glGetShaderSource(shaderID, logLength, &returnedLogLength, log); - ASSERT(logLength == returnedLogLength + 1); - String res = String(log, returnedLogLength); - fastFree(log); - return res; -} - -String GraphicsContext3D::getString(unsigned long name) -{ - makeContextCurrent(); - return String(reinterpret_cast<const char*>(glGetString(name))); -} - -void GraphicsContext3D::getTexParameterfv(unsigned long target, unsigned long pname, float* value) -{ - makeContextCurrent(); - glGetTexParameterfv(target, pname, value); -} - -void GraphicsContext3D::getTexParameteriv(unsigned long target, unsigned long pname, int* value) -{ - makeContextCurrent(); - glGetTexParameteriv(target, pname, value); -} - -void GraphicsContext3D::getUniformfv(WebGLProgram* program, long location, float* value) -{ - makeContextCurrent(); - glGetUniformfv(EXTRACT(program), location, value); -} - -void GraphicsContext3D::getUniformiv(WebGLProgram* program, long location, int* value) -{ - makeContextCurrent(); - glGetUniformiv(EXTRACT(program), location, value); -} - -long GraphicsContext3D::getUniformLocation(WebGLProgram* program, const String& name) -{ - if (!program) - return -1; - - makeContextCurrent(); - return glGetUniformLocation(EXTRACT(program), name.utf8().data()); -} - -void GraphicsContext3D::getVertexAttribfv(unsigned long index, - unsigned long pname, - float* value) -{ - makeContextCurrent(); - glGetVertexAttribfv(index, pname, value); -} - -void GraphicsContext3D::getVertexAttribiv(unsigned long index, - unsigned long pname, - int* value) -{ - makeContextCurrent(); - glGetVertexAttribiv(index, pname, value); -} - -long GraphicsContext3D::getVertexAttribOffset(unsigned long index, unsigned long pname) -{ - // FIXME: implement. - notImplemented(); - return 0; -} - -GL_SAME_METHOD_2(Hint, hint, unsigned long, unsigned long); - -bool GraphicsContext3D::isBuffer(WebGLBuffer* buffer) -{ - makeContextCurrent(); - return glIsBuffer(EXTRACT(buffer)); -} - -bool GraphicsContext3D::isEnabled(unsigned long cap) -{ - makeContextCurrent(); - return glIsEnabled(cap); -} - -bool GraphicsContext3D::isFramebuffer(WebGLFramebuffer* framebuffer) -{ - makeContextCurrent(); - return glIsFramebufferEXT(EXTRACT(framebuffer)); -} - -bool GraphicsContext3D::isProgram(WebGLProgram* program) -{ - makeContextCurrent(); - return glIsProgram(EXTRACT(program)); -} - -bool GraphicsContext3D::isRenderbuffer(WebGLRenderbuffer* renderbuffer) -{ - makeContextCurrent(); - return glIsRenderbufferEXT(EXTRACT(renderbuffer)); -} - -bool GraphicsContext3D::isShader(WebGLShader* shader) -{ - makeContextCurrent(); - return glIsShader(EXTRACT(shader)); -} - -bool GraphicsContext3D::isTexture(WebGLTexture* texture) -{ - makeContextCurrent(); - return glIsTexture(EXTRACT(texture)); -} - -GL_SAME_METHOD_1(LineWidth, lineWidth, double) - -GL_SAME_METHOD_1_X(LinkProgram, linkProgram, WebGLProgram*) - -void GraphicsContext3D::pixelStorei(unsigned long pname, long param) -{ - if (pname != GL_PACK_ALIGNMENT && pname != GL_UNPACK_ALIGNMENT) { - // FIXME: Create a fake GL error and throw an exception. - return; - } - - makeContextCurrent(); - glPixelStorei(pname, param); -} - -GL_SAME_METHOD_2(PolygonOffset, polygonOffset, double, double) - -PassRefPtr<WebGLArray> GraphicsContext3D::readPixels(long x, long y, - unsigned long width, unsigned long height, - unsigned long format, unsigned long type) { - // FIXME: support more pixel formats and types. - if (!((format == GL_RGBA) && (type == GL_UNSIGNED_BYTE))) - return 0; - - // FIXME: take into account pack alignment. - RefPtr<WebGLUnsignedByteArray> array = WebGLUnsignedByteArray::create(width * height * 4); - glReadPixels(x, y, width, height, format, type, array->baseAddress()); - return array; -} - -void GraphicsContext3D::releaseShaderCompiler() -{ -} - -GL_SAME_METHOD_4(RenderbufferStorageEXT, renderbufferStorage, unsigned long, unsigned long, unsigned long, unsigned long) - -GL_SAME_METHOD_2(SampleCoverage, sampleCoverage, double, bool) - -GL_SAME_METHOD_4(Scissor, scissor, long, long, unsigned long, unsigned long) - -void GraphicsContext3D::shaderSource(WebGLShader* shader, const String& source) -{ - makeContextCurrent(); - CString str = source.utf8(); - const char* data = str.data(); - GLint length = str.length(); - glShaderSource(EXTRACT(shader), 1, &data, &length); -} - -GL_SAME_METHOD_3(StencilFunc, stencilFunc, unsigned long, long, unsigned long) - -GL_SAME_METHOD_4(StencilFuncSeparate, stencilFuncSeparate, unsigned long, unsigned long, long, unsigned long) - -GL_SAME_METHOD_1(StencilMask, stencilMask, unsigned long) - -GL_SAME_METHOD_2(StencilMaskSeparate, stencilMaskSeparate, unsigned long, unsigned long) - -GL_SAME_METHOD_3(StencilOp, stencilOp, unsigned long, unsigned long, unsigned long) - -GL_SAME_METHOD_4(StencilOpSeparate, stencilOpSeparate, unsigned long, unsigned long, unsigned long, unsigned long) - -void GraphicsContext3D::synthesizeGLError(unsigned long error) -{ - m_internal->synthesizeGLError(error); -} - -int GraphicsContext3D::texImage2D(unsigned target, - unsigned level, - unsigned internalformat, - unsigned width, - unsigned height, - unsigned border, - unsigned format, - unsigned type, - void* pixels) -{ - // FIXME: must do validation similar to JOGL's to ensure that - // the incoming array is of the appropriate length. - glTexImage2D(target, - level, - internalformat, - width, - height, - border, - format, - type, - pixels); - return 0; -} - -// Remove premultiplied alpha from color channels. -// FIXME: this is lossy. Must retrieve original values from HTMLImageElement. -static void unmultiplyAlpha(unsigned char* rgbaData, int numPixels) -{ - for (int j = 0; j < numPixels; j++) { - float b = rgbaData[4*j+0] / 255.0f; - float g = rgbaData[4*j+1] / 255.0f; - float r = rgbaData[4*j+2] / 255.0f; - float a = rgbaData[4*j+3] / 255.0f; - if (a > 0.0f) { - b /= a; - g /= a; - r /= a; - b = (b > 1.0f) ? 1.0f : b; - g = (g > 1.0f) ? 1.0f : g; - r = (r > 1.0f) ? 1.0f : r; - rgbaData[4*j+0] = (unsigned char) (b * 255.0f); - rgbaData[4*j+1] = (unsigned char) (g * 255.0f); - rgbaData[4*j+2] = (unsigned char) (r * 255.0f); - } - } -} - -// FIXME: this must be changed to refer to the original image data -// rather than unmultiplying the alpha channel. -static int texImage2DHelper(unsigned target, unsigned level, - int width, int height, - int rowBytes, - bool flipY, - bool premultiplyAlpha, - GLenum format, - bool skipAlpha, - unsigned char* pixels) -{ - ASSERT(format == GL_RGBA || format == GL_BGRA); - GLint internalFormat = GL_RGBA8; - if (skipAlpha) { - internalFormat = GL_RGB8; - // Ignore the alpha channel - premultiplyAlpha = true; - } - if (flipY) { - // Need to flip images vertically. To avoid making a copy of - // the entire image, we perform a ton of glTexSubImage2D - // calls. FIXME: should rethink this strategy for efficiency. - glTexImage2D(target, level, internalFormat, - width, - height, - 0, - format, - GL_UNSIGNED_BYTE, - 0); - unsigned char* row = 0; - bool allocatedRow = false; - if (!premultiplyAlpha) { - row = new unsigned char[rowBytes]; - allocatedRow = true; - } - for (int i = 0; i < height; i++) { - if (premultiplyAlpha) - row = pixels + (rowBytes * i); - else { - memcpy(row, pixels + (rowBytes * i), rowBytes); - unmultiplyAlpha(row, width); - } - glTexSubImage2D(target, level, 0, height - i - 1, - width, 1, - format, - GL_UNSIGNED_BYTE, - row); - } - if (allocatedRow) - delete[] row; - } else { - // The pixels of cube maps' faces are defined with a top-down - // scanline ordering, unlike GL_TEXTURE_2D, so when uploading - // these, the above vertical flip is the wrong thing to do. - if (premultiplyAlpha) - glTexImage2D(target, level, internalFormat, - width, - height, - 0, - format, - GL_UNSIGNED_BYTE, - pixels); - else { - glTexImage2D(target, level, internalFormat, - width, - height, - 0, - format, - GL_UNSIGNED_BYTE, - 0); - unsigned char* row = new unsigned char[rowBytes]; - for (int i = 0; i < height; i++) { - memcpy(row, pixels + (rowBytes * i), rowBytes); - unmultiplyAlpha(row, width); - glTexSubImage2D(target, level, 0, i, - width, 1, - format, - GL_UNSIGNED_BYTE, - row); - } - delete[] row; - } - } - return 0; -} - -int GraphicsContext3D::texImage2D(unsigned target, unsigned level, Image* image, - bool flipY, bool premultiplyAlpha) -{ - ASSERT(image); - - int res = -1; -#if PLATFORM(SKIA) - NativeImageSkia* skiaImage = image->nativeImageForCurrentFrame(); - if (!skiaImage) { - ASSERT_NOT_REACHED(); - return -1; - } - SkBitmap::Config skiaConfig = skiaImage->config(); - // FIXME: must support more image configurations. - if (skiaConfig != SkBitmap::kARGB_8888_Config) { - ASSERT_NOT_REACHED(); - return -1; - } - SkBitmap& skiaImageRef = *skiaImage; - SkAutoLockPixels lock(skiaImageRef); - int width = skiaImage->width(); - int height = skiaImage->height(); - unsigned char* pixels = - reinterpret_cast<unsigned char*>(skiaImage->getPixels()); - int rowBytes = skiaImage->rowBytes(); - res = texImage2DHelper(target, level, - width, height, - rowBytes, - flipY, premultiplyAlpha, - GL_BGRA, - false, - pixels); -#elif PLATFORM(CG) - CGImageRef cgImage = image->nativeImageForCurrentFrame(); - if (!cgImage) { - ASSERT_NOT_REACHED(); - return -1; - } - int width = CGImageGetWidth(cgImage); - int height = CGImageGetHeight(cgImage); - int rowBytes = width * 4; - CGImageAlphaInfo info = CGImageGetAlphaInfo(cgImage); - bool skipAlpha = (info == kCGImageAlphaNone - || info == kCGImageAlphaNoneSkipLast - || info == kCGImageAlphaNoneSkipFirst); - unsigned char* imageData = new unsigned char[height * rowBytes]; - CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); - CGContextRef tmpContext = CGBitmapContextCreate(imageData, width, height, 8, rowBytes, - colorSpace, - kCGImageAlphaPremultipliedLast); - CGColorSpaceRelease(colorSpace); - CGContextSetBlendMode(tmpContext, kCGBlendModeCopy); - CGContextDrawImage(tmpContext, - CGRectMake(0, 0, static_cast<CGFloat>(width), static_cast<CGFloat>(height)), - cgImage); - CGContextRelease(tmpContext); - res = texImage2DHelper(target, level, width, height, rowBytes, - flipY, premultiplyAlpha, GL_RGBA, skipAlpha, imageData); - delete[] imageData; -#else -#error Must port to your platform -#endif - return res; -} - -GL_SAME_METHOD_3(TexParameterf, texParameterf, unsigned, unsigned, float); - -GL_SAME_METHOD_3(TexParameteri, texParameteri, unsigned, unsigned, int); - -int GraphicsContext3D::texSubImage2D(unsigned target, - unsigned level, - unsigned xoffset, - unsigned yoffset, - unsigned width, - unsigned height, - unsigned format, - unsigned type, - void* pixels) -{ - glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); - return 0; -} - -int GraphicsContext3D::texSubImage2D(unsigned target, - unsigned level, - unsigned xoffset, - unsigned yoffset, - Image* image, - bool flipY, - bool premultiplyAlpha) -{ - // FIXME: implement. - notImplemented(); - return -1; -} - -GL_SAME_METHOD_2(Uniform1f, uniform1f, long, float) - -void GraphicsContext3D::uniform1fv(long location, float* v, int size) -{ - makeContextCurrent(); - glUniform1fv(location, size, v); -} - -GL_SAME_METHOD_2(Uniform1i, uniform1i, long, int) - -void GraphicsContext3D::uniform1iv(long location, int* v, int size) -{ - makeContextCurrent(); - glUniform1iv(location, size, v); -} - -GL_SAME_METHOD_3(Uniform2f, uniform2f, long, float, float) - -void GraphicsContext3D::uniform2fv(long location, float* v, int size) -{ - makeContextCurrent(); - glUniform2fv(location, size, v); -} - -GL_SAME_METHOD_3(Uniform2i, uniform2i, long, int, int) - -void GraphicsContext3D::uniform2iv(long location, int* v, int size) -{ - makeContextCurrent(); - glUniform2iv(location, size, v); -} - -GL_SAME_METHOD_4(Uniform3f, uniform3f, long, float, float, float) - -void GraphicsContext3D::uniform3fv(long location, float* v, int size) -{ - makeContextCurrent(); - glUniform3fv(location, size, v); -} - -GL_SAME_METHOD_4(Uniform3i, uniform3i, long, int, int, int) - -void GraphicsContext3D::uniform3iv(long location, int* v, int size) -{ - makeContextCurrent(); - glUniform3iv(location, size, v); -} - -GL_SAME_METHOD_5(Uniform4f, uniform4f, long, float, float, float, float) - -void GraphicsContext3D::uniform4fv(long location, float* v, int size) -{ - makeContextCurrent(); - glUniform4fv(location, size, v); -} - -GL_SAME_METHOD_5(Uniform4i, uniform4i, long, int, int, int, int) - -void GraphicsContext3D::uniform4iv(long location, int* v, int size) -{ - makeContextCurrent(); - glUniform4iv(location, size, v); -} - -void GraphicsContext3D::uniformMatrix2fv(long location, bool transpose, float* value, int size) -{ - makeContextCurrent(); - glUniformMatrix2fv(location, size, transpose, value); -} - -void GraphicsContext3D::uniformMatrix3fv(long location, bool transpose, float* value, int size) -{ - makeContextCurrent(); - glUniformMatrix3fv(location, size, transpose, value); -} - -void GraphicsContext3D::uniformMatrix4fv(long location, bool transpose, float* value, int size) -{ - makeContextCurrent(); - glUniformMatrix4fv(location, size, transpose, value); -} - -GL_SAME_METHOD_1_X(UseProgram, useProgram, WebGLProgram*) - -GL_SAME_METHOD_1_X(ValidateProgram, validateProgram, WebGLProgram*) - -GL_SAME_METHOD_2(VertexAttrib1f, vertexAttrib1f, unsigned long, float) - -void GraphicsContext3D::vertexAttrib1fv(unsigned long indx, float* values) -{ - makeContextCurrent(); - glVertexAttrib1fv(indx, values); -} - -GL_SAME_METHOD_3(VertexAttrib2f, vertexAttrib2f, unsigned long, float, float) - -void GraphicsContext3D::vertexAttrib2fv(unsigned long indx, float* values) -{ - makeContextCurrent(); - glVertexAttrib2fv(indx, values); -} - -GL_SAME_METHOD_4(VertexAttrib3f, vertexAttrib3f, unsigned long, float, float, float) - -void GraphicsContext3D::vertexAttrib3fv(unsigned long indx, float* values) -{ - makeContextCurrent(); - glVertexAttrib3fv(indx, values); -} - -GL_SAME_METHOD_5(VertexAttrib4f, vertexAttrib4f, unsigned long, float, float, float, float) - -void GraphicsContext3D::vertexAttrib4fv(unsigned long indx, float* values) -{ - makeContextCurrent(); - glVertexAttrib4fv(indx, values); -} - -void GraphicsContext3D::vertexAttribPointer(unsigned long indx, int size, int type, bool normalized, - unsigned long stride, unsigned long offset) -{ - m_internal->vertexAttribPointer(indx, size, type, normalized, stride, offset); -} - -void GraphicsContext3D::viewport(long x, long y, unsigned long width, unsigned long height) -{ - makeContextCurrent(); - m_internal->viewportImpl(x, y, width, height); -} - -} - -#endif // ENABLE(3D_CANVAS) diff --git a/WebKit/chromium/src/GraphicsContext3DChromium.cpp b/WebKit/chromium/src/GraphicsContext3DChromium.cpp new file mode 100644 index 0000000..cc0c5bc --- /dev/null +++ b/WebKit/chromium/src/GraphicsContext3DChromium.cpp @@ -0,0 +1,1051 @@ +/* + * Copyright (C) 2009 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" + +#if ENABLE(3D_CANVAS) + +#include "GraphicsContext3D.h" + +#include "CachedImage.h" +#include "WebGLLayerChromium.h" +#include "CanvasRenderingContext.h" +#include "Chrome.h" +#include "ChromeClientImpl.h" +#include "Extensions3DChromium.h" +#include "GraphicsContext3DInternal.h" +#include "HTMLCanvasElement.h" +#include "HTMLImageElement.h" +#include "ImageBuffer.h" +#include "ImageData.h" +#include "WebGraphicsContext3D.h" +#include "WebGraphicsContext3DDefaultImpl.h" +#include "WebKit.h" +#include "WebKitClient.h" +#include "WebViewImpl.h" + +#include <stdio.h> +#include <wtf/FastMalloc.h> +#include <wtf/text/CString.h> + +#if PLATFORM(CG) +#include "GraphicsContext.h" +#include "WebGLRenderingContext.h" +#include <CoreGraphics/CGContext.h> +#include <CoreGraphics/CGImage.h> +#endif + +// There are two levels of delegation in this file: +// +// 1. GraphicsContext3D delegates to GraphicsContext3DInternal. This is done +// so that we have some place to store data members common among +// implementations; GraphicsContext3D only provides us the m_internal +// pointer. We always delegate to the GraphicsContext3DInternal. While we +// could sidestep it and go directly to the WebGraphicsContext3D in some +// cases, it is better for consistency to always delegate through it. +// +// 2. GraphicsContext3DInternal delegates to an implementation of +// WebGraphicsContext3D. This is done so we have a place to inject an +// implementation which remotes the OpenGL calls across processes. +// +// The legacy, in-process, implementation uses WebGraphicsContext3DDefaultImpl. + +namespace WebCore { + +//---------------------------------------------------------------------- +// GraphicsContext3DInternal + +GraphicsContext3DInternal::GraphicsContext3DInternal() + : m_webViewImpl(0) + , m_initializedAvailableExtensions(false) +#if PLATFORM(SKIA) +#elif PLATFORM(CG) + , m_renderOutput(0) +#else +#error Must port to your platform +#endif +{ +} + +GraphicsContext3DInternal::~GraphicsContext3DInternal() +{ +#if PLATFORM(CG) + if (m_renderOutput) + delete[] m_renderOutput; +#endif +} + +bool GraphicsContext3DInternal::initialize(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool renderDirectlyToHostWindow) +{ + WebKit::WebGraphicsContext3D::Attributes webAttributes; + webAttributes.alpha = attrs.alpha; + webAttributes.depth = attrs.depth; + webAttributes.stencil = attrs.stencil; + webAttributes.antialias = attrs.antialias; + webAttributes.premultipliedAlpha = attrs.premultipliedAlpha; + webAttributes.canRecoverFromContextLoss = attrs.canRecoverFromContextLoss; + WebKit::WebGraphicsContext3D* webContext = WebKit::webKitClient()->createGraphicsContext3D(); + if (!webContext) + return false; + + Chrome* chrome = static_cast<Chrome*>(hostWindow); + WebKit::ChromeClientImpl* chromeClientImpl = static_cast<WebKit::ChromeClientImpl*>(chrome->client()); + + m_webViewImpl = chromeClientImpl->webView(); + + if (!m_webViewImpl) + return false; + if (!webContext->initialize(webAttributes, m_webViewImpl, renderDirectlyToHostWindow)) { + delete webContext; + return false; + } + m_impl.set(webContext); + +#if USE(ACCELERATED_COMPOSITING) + m_compositingLayer = WebGLLayerChromium::create(0); +#endif + return true; +} + +WebKit::WebGraphicsContext3D* GraphicsContext3DInternal::extractWebGraphicsContext3D(GraphicsContext3D* context) +{ + if (!context) + return 0; + return context->m_internal->m_impl.get(); +} + +PlatformGraphicsContext3D GraphicsContext3DInternal::platformGraphicsContext3D() const +{ + return m_impl.get(); +} + +Platform3DObject GraphicsContext3DInternal::platformTexture() const +{ + return m_impl->getPlatformTextureId(); +} + +void GraphicsContext3DInternal::prepareTexture() +{ + m_impl->prepareTexture(); +} + +#if USE(ACCELERATED_COMPOSITING) +WebGLLayerChromium* GraphicsContext3DInternal::platformLayer() const +{ + return m_compositingLayer.get(); +} +#endif + +void GraphicsContext3DInternal::paintRenderingResultsToCanvas(CanvasRenderingContext* context) +{ + HTMLCanvasElement* canvas = context->canvas(); + ImageBuffer* imageBuffer = canvas->buffer(); + unsigned char* pixels = 0; +#if PLATFORM(SKIA) + const SkBitmap* canvasBitmap = imageBuffer->context()->platformContext()->bitmap(); + const SkBitmap* readbackBitmap = 0; + ASSERT(canvasBitmap->config() == SkBitmap::kARGB_8888_Config); + if (canvasBitmap->width() == m_impl->width() && canvasBitmap->height() == m_impl->height()) { + // This is the fastest and most common case. We read back + // directly into the canvas's backing store. + readbackBitmap = canvasBitmap; + m_resizingBitmap.reset(); + } else { + // We need to allocate a temporary bitmap for reading back the + // pixel data. We will then use Skia to rescale this bitmap to + // the size of the canvas's backing store. + if (m_resizingBitmap.width() != m_impl->width() || m_resizingBitmap.height() != m_impl->height()) { + m_resizingBitmap.setConfig(SkBitmap::kARGB_8888_Config, + m_impl->width(), + m_impl->height()); + if (!m_resizingBitmap.allocPixels()) + return; + } + readbackBitmap = &m_resizingBitmap; + } + + // Read back the frame buffer. + SkAutoLockPixels bitmapLock(*readbackBitmap); + pixels = static_cast<unsigned char*>(readbackBitmap->getPixels()); +#elif PLATFORM(CG) + if (m_renderOutput) + pixels = m_renderOutput; +#else +#error Must port to your platform +#endif + + m_impl->readBackFramebuffer(pixels, 4 * m_impl->width() * m_impl->height()); + +#if PLATFORM(SKIA) + if (m_resizingBitmap.readyToDraw()) { + // We need to draw the resizing bitmap into the canvas's backing store. + SkCanvas canvas(*canvasBitmap); + SkRect dst; + dst.set(SkIntToScalar(0), SkIntToScalar(0), canvasBitmap->width(), canvasBitmap->height()); + canvas.drawBitmapRect(m_resizingBitmap, 0, dst); + } +#elif PLATFORM(CG) + if (m_renderOutput && context->is3d()) { + WebGLRenderingContext* webGLContext = static_cast<WebGLRenderingContext*>(context); + webGLContext->graphicsContext3D()->paintToCanvas(m_renderOutput, m_impl->width(), m_impl->height(), canvas->width(), canvas->height(), imageBuffer->context()->platformContext()); + } +#else +#error Must port to your platform +#endif +} + +bool GraphicsContext3DInternal::paintsIntoCanvasBuffer() const +{ + // If the gpu compositor is on then skip the readback and software rendering path. + return !m_webViewImpl->isAcceleratedCompositingActive(); +} + +void GraphicsContext3DInternal::reshape(int width, int height) +{ + if (width == m_impl->width() && height == m_impl->height()) + return; + + m_impl->reshape(width, height); + +#if PLATFORM(CG) + // Need to reallocate the client-side backing store. + // FIXME: make this more efficient. + if (m_renderOutput) { + delete[] m_renderOutput; + m_renderOutput = 0; + } + int rowBytes = width * 4; + m_renderOutput = new unsigned char[height * rowBytes]; +#endif // PLATFORM(CG) +} + +bool GraphicsContext3DInternal::isContextLost() +{ + return m_impl->isContextLost(); +} + +// Macros to assist in delegating from GraphicsContext3DInternal to +// WebGraphicsContext3D. + +#define DELEGATE_TO_IMPL(name) \ +void GraphicsContext3DInternal::name() \ +{ \ + m_impl->name(); \ +} + +#define DELEGATE_TO_IMPL_R(name, rt) \ +rt GraphicsContext3DInternal::name() \ +{ \ + return m_impl->name(); \ +} + +#define DELEGATE_TO_IMPL_1(name, t1) \ +void GraphicsContext3DInternal::name(t1 a1) \ +{ \ + m_impl->name(a1); \ +} + +#define DELEGATE_TO_IMPL_1R(name, t1, rt) \ +rt GraphicsContext3DInternal::name(t1 a1) \ +{ \ + return m_impl->name(a1); \ +} + +#define DELEGATE_TO_IMPL_2(name, t1, t2) \ +void GraphicsContext3DInternal::name(t1 a1, t2 a2) \ +{ \ + m_impl->name(a1, a2); \ +} + +#define DELEGATE_TO_IMPL_2R(name, t1, t2, rt) \ +rt GraphicsContext3DInternal::name(t1 a1, t2 a2) \ +{ \ + return m_impl->name(a1, a2); \ +} + +#define DELEGATE_TO_IMPL_3(name, t1, t2, t3) \ +void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3) \ +{ \ + m_impl->name(a1, a2, a3); \ +} + +#define DELEGATE_TO_IMPL_3R(name, t1, t2, t3, rt) \ +rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3) \ +{ \ + return m_impl->name(a1, a2, a3); \ +} + +#define DELEGATE_TO_IMPL_4(name, t1, t2, t3, t4) \ +void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4) \ +{ \ + m_impl->name(a1, a2, a3, a4); \ +} + +#define DELEGATE_TO_IMPL_4R(name, t1, t2, t3, t4, rt) \ +rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4) \ +{ \ + return m_impl->name(a1, a2, a3, a4); \ +} + +#define DELEGATE_TO_IMPL_5(name, t1, t2, t3, t4, t5) \ +void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \ +{ \ + m_impl->name(a1, a2, a3, a4, a5); \ +} + +#define DELEGATE_TO_IMPL_5R(name, t1, t2, t3, t4, t5, rt) \ +rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \ +{ \ + return m_impl->name(a1, a2, a3, a4, a5); \ +} + +#define DELEGATE_TO_IMPL_6(name, t1, t2, t3, t4, t5, t6) \ +void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ +{ \ + m_impl->name(a1, a2, a3, a4, a5, a6); \ +} + +#define DELEGATE_TO_IMPL_6R(name, t1, t2, t3, t4, t5, t6, rt) \ +rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ +{ \ + return m_impl->name(a1, a2, a3, a4, a5, a6); \ +} + +#define DELEGATE_TO_IMPL_7(name, t1, t2, t3, t4, t5, t6, t7) \ +void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \ +{ \ + m_impl->name(a1, a2, a3, a4, a5, a6, a7); \ +} + +#define DELEGATE_TO_IMPL_7R(name, t1, t2, t3, t4, t5, t6, t7, rt) \ +rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \ +{ \ + return m_impl->name(a1, a2, a3, a4, a5, a6, a7); \ +} + +#define DELEGATE_TO_IMPL_8(name, t1, t2, t3, t4, t5, t6, t7, t8) \ +void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) \ +{ \ + m_impl->name(a1, a2, a3, a4, a5, a6, a7, a8); \ +} + +#define DELEGATE_TO_IMPL_9R(name, t1, t2, t3, t4, t5, t6, t7, t8, t9, rt) \ +rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8, t9 a9) \ +{ \ + return m_impl->name(a1, a2, a3, a4, a5, a6, a7, a8, a9); \ +} + +DELEGATE_TO_IMPL_R(makeContextCurrent, bool) +DELEGATE_TO_IMPL_1R(sizeInBytes, int, int) + +bool GraphicsContext3DInternal::isGLES2Compliant() const +{ + return m_impl->isGLES2Compliant(); +} + +DELEGATE_TO_IMPL_1(activeTexture, unsigned long) +DELEGATE_TO_IMPL_2(attachShader, Platform3DObject, Platform3DObject) + +void GraphicsContext3DInternal::bindAttribLocation(Platform3DObject program, unsigned long index, const String& name) +{ + m_impl->bindAttribLocation(program, index, name.utf8().data()); +} + +DELEGATE_TO_IMPL_2(bindBuffer, unsigned long, Platform3DObject) +DELEGATE_TO_IMPL_2(bindFramebuffer, unsigned long, Platform3DObject) +DELEGATE_TO_IMPL_2(bindRenderbuffer, unsigned long, Platform3DObject) +DELEGATE_TO_IMPL_2(bindTexture, unsigned long, Platform3DObject) +DELEGATE_TO_IMPL_4(blendColor, double, double, double, double) +DELEGATE_TO_IMPL_1(blendEquation, unsigned long) +DELEGATE_TO_IMPL_2(blendEquationSeparate, unsigned long, unsigned long) +DELEGATE_TO_IMPL_2(blendFunc, unsigned long, unsigned long) +DELEGATE_TO_IMPL_4(blendFuncSeparate, unsigned long, unsigned long, unsigned long, unsigned long) + +void GraphicsContext3DInternal::bufferData(unsigned long target, int size, unsigned long usage) +{ + m_impl->bufferData(target, size, 0, usage); +} + +void GraphicsContext3DInternal::bufferData(unsigned long target, int size, const void* data, unsigned long usage) +{ + m_impl->bufferData(target, size, data, usage); +} + +void GraphicsContext3DInternal::bufferSubData(unsigned long target, long offset, int size, const void* data) +{ + m_impl->bufferSubData(target, offset, size, data); +} + +DELEGATE_TO_IMPL_1R(checkFramebufferStatus, unsigned long, unsigned long) +DELEGATE_TO_IMPL_1(clear, unsigned long) +DELEGATE_TO_IMPL_4(clearColor, double, double, double, double) +DELEGATE_TO_IMPL_1(clearDepth, double) +DELEGATE_TO_IMPL_1(clearStencil, long) +DELEGATE_TO_IMPL_4(colorMask, bool, bool, bool, bool) +DELEGATE_TO_IMPL_1(compileShader, Platform3DObject) + +DELEGATE_TO_IMPL_8(copyTexImage2D, unsigned long, long, unsigned long, long, long, unsigned long, unsigned long, long) +DELEGATE_TO_IMPL_8(copyTexSubImage2D, unsigned long, long, long, long, long, long, unsigned long, unsigned long) +DELEGATE_TO_IMPL_1(cullFace, unsigned long) +DELEGATE_TO_IMPL_1(depthFunc, unsigned long) +DELEGATE_TO_IMPL_1(depthMask, bool) +DELEGATE_TO_IMPL_2(depthRange, double, double) +DELEGATE_TO_IMPL_2(detachShader, Platform3DObject, Platform3DObject) +DELEGATE_TO_IMPL_1(disable, unsigned long) +DELEGATE_TO_IMPL_1(disableVertexAttribArray, unsigned long) +DELEGATE_TO_IMPL_3(drawArrays, unsigned long, long, long) +DELEGATE_TO_IMPL_4(drawElements, unsigned long, unsigned long, unsigned long, long) + +DELEGATE_TO_IMPL_1(enable, unsigned long) +DELEGATE_TO_IMPL_1(enableVertexAttribArray, unsigned long) +DELEGATE_TO_IMPL(finish) +DELEGATE_TO_IMPL(flush) +DELEGATE_TO_IMPL_4(framebufferRenderbuffer, unsigned long, unsigned long, unsigned long, Platform3DObject) +DELEGATE_TO_IMPL_5(framebufferTexture2D, unsigned long, unsigned long, unsigned long, Platform3DObject, long) +DELEGATE_TO_IMPL_1(frontFace, unsigned long) +DELEGATE_TO_IMPL_1(generateMipmap, unsigned long) + +bool GraphicsContext3DInternal::getActiveAttrib(Platform3DObject program, unsigned long index, ActiveInfo& info) +{ + WebKit::WebGraphicsContext3D::ActiveInfo webInfo; + if (!m_impl->getActiveAttrib(program, index, webInfo)) + return false; + info.name = webInfo.name; + info.type = webInfo.type; + info.size = webInfo.size; + return true; +} + +bool GraphicsContext3DInternal::getActiveUniform(Platform3DObject program, unsigned long index, ActiveInfo& info) +{ + WebKit::WebGraphicsContext3D::ActiveInfo webInfo; + if (!m_impl->getActiveUniform(program, index, webInfo)) + return false; + info.name = webInfo.name; + info.type = webInfo.type; + info.size = webInfo.size; + return true; +} + +DELEGATE_TO_IMPL_4(getAttachedShaders, Platform3DObject, int, int*, unsigned int*) + +int GraphicsContext3DInternal::getAttribLocation(Platform3DObject program, const String& name) +{ + return m_impl->getAttribLocation(program, name.utf8().data()); +} + +DELEGATE_TO_IMPL_2(getBooleanv, unsigned long, unsigned char*) + +DELEGATE_TO_IMPL_3(getBufferParameteriv, unsigned long, unsigned long, int*) + +GraphicsContext3D::Attributes GraphicsContext3DInternal::getContextAttributes() +{ + WebKit::WebGraphicsContext3D::Attributes webAttributes = m_impl->getContextAttributes(); + GraphicsContext3D::Attributes attributes; + attributes.alpha = webAttributes.alpha; + attributes.depth = webAttributes.depth; + attributes.stencil = webAttributes.stencil; + attributes.antialias = webAttributes.antialias; + attributes.premultipliedAlpha = webAttributes.premultipliedAlpha; + return attributes; +} + +DELEGATE_TO_IMPL_R(getError, unsigned long) + +DELEGATE_TO_IMPL_2(getFloatv, unsigned long, float*) + +DELEGATE_TO_IMPL_4(getFramebufferAttachmentParameteriv, unsigned long, unsigned long, unsigned long, int*) + +DELEGATE_TO_IMPL_2(getIntegerv, unsigned long, int*) + +DELEGATE_TO_IMPL_3(getProgramiv, Platform3DObject, unsigned long, int*) + +String GraphicsContext3DInternal::getProgramInfoLog(Platform3DObject program) +{ + return m_impl->getProgramInfoLog(program); +} + +DELEGATE_TO_IMPL_3(getRenderbufferParameteriv, unsigned long, unsigned long, int*) + +DELEGATE_TO_IMPL_3(getShaderiv, Platform3DObject, unsigned long, int*) + +String GraphicsContext3DInternal::getShaderInfoLog(Platform3DObject shader) +{ + return m_impl->getShaderInfoLog(shader); +} + +String GraphicsContext3DInternal::getShaderSource(Platform3DObject shader) +{ + return m_impl->getShaderSource(shader); +} + +String GraphicsContext3DInternal::getString(unsigned long name) +{ + return m_impl->getString(name); +} + +DELEGATE_TO_IMPL_3(getTexParameterfv, unsigned long, unsigned long, float*) +DELEGATE_TO_IMPL_3(getTexParameteriv, unsigned long, unsigned long, int*) + +DELEGATE_TO_IMPL_3(getUniformfv, Platform3DObject, long, float*) +DELEGATE_TO_IMPL_3(getUniformiv, Platform3DObject, long, int*) + +long GraphicsContext3DInternal::getUniformLocation(Platform3DObject program, const String& name) +{ + return m_impl->getUniformLocation(program, name.utf8().data()); +} + +DELEGATE_TO_IMPL_3(getVertexAttribfv, unsigned long, unsigned long, float*) +DELEGATE_TO_IMPL_3(getVertexAttribiv, unsigned long, unsigned long, int*) + +DELEGATE_TO_IMPL_2R(getVertexAttribOffset, unsigned long, unsigned long, long) + +DELEGATE_TO_IMPL_2(hint, unsigned long, unsigned long) +DELEGATE_TO_IMPL_1R(isBuffer, Platform3DObject, bool) +DELEGATE_TO_IMPL_1R(isEnabled, unsigned long, bool) +DELEGATE_TO_IMPL_1R(isFramebuffer, Platform3DObject, bool) +DELEGATE_TO_IMPL_1R(isProgram, Platform3DObject, bool) +DELEGATE_TO_IMPL_1R(isRenderbuffer, Platform3DObject, bool) +DELEGATE_TO_IMPL_1R(isShader, Platform3DObject, bool) +DELEGATE_TO_IMPL_1R(isTexture, Platform3DObject, bool) +DELEGATE_TO_IMPL_1(lineWidth, double) +DELEGATE_TO_IMPL_1(linkProgram, Platform3DObject) +DELEGATE_TO_IMPL_2(pixelStorei, unsigned long, long) +DELEGATE_TO_IMPL_2(polygonOffset, double, double) +DELEGATE_TO_IMPL_7(readPixels, long, long, unsigned long, unsigned long, unsigned long, unsigned long, void*) +DELEGATE_TO_IMPL(releaseShaderCompiler) +DELEGATE_TO_IMPL_4(renderbufferStorage, unsigned long, unsigned long, unsigned long, unsigned long) +DELEGATE_TO_IMPL_2(sampleCoverage, double, bool) +DELEGATE_TO_IMPL_4(scissor, long, long, unsigned long, unsigned long) + +void GraphicsContext3DInternal::shaderSource(Platform3DObject shader, const String& string) +{ + m_impl->shaderSource(shader, string.utf8().data()); +} + +DELEGATE_TO_IMPL_3(stencilFunc, unsigned long, long, unsigned long) +DELEGATE_TO_IMPL_4(stencilFuncSeparate, unsigned long, unsigned long, long, unsigned long) +DELEGATE_TO_IMPL_1(stencilMask, unsigned long) +DELEGATE_TO_IMPL_2(stencilMaskSeparate, unsigned long, unsigned long) +DELEGATE_TO_IMPL_3(stencilOp, unsigned long, unsigned long, unsigned long) +DELEGATE_TO_IMPL_4(stencilOpSeparate, unsigned long, unsigned long, unsigned long, unsigned long) + +int GraphicsContext3DInternal::texImage2D(unsigned target, unsigned level, unsigned internalformat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, void* pixels) +{ + m_impl->texImage2D(target, level, internalformat, width, height, border, format, type, pixels); + return 0; +} + +DELEGATE_TO_IMPL_3(texParameterf, unsigned, unsigned, float) +DELEGATE_TO_IMPL_3(texParameteri, unsigned, unsigned, int) + +int GraphicsContext3DInternal::texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, unsigned format, unsigned type, void* pixels) +{ + m_impl->texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + return 0; +} + +DELEGATE_TO_IMPL_2(uniform1f, long, float) + +void GraphicsContext3DInternal::uniform1fv(long location, float* v, int size) +{ + m_impl->uniform1fv(location, size, v); +} + +DELEGATE_TO_IMPL_2(uniform1i, long, int) + +void GraphicsContext3DInternal::uniform1iv(long location, int* v, int size) +{ + m_impl->uniform1iv(location, size, v); +} + +DELEGATE_TO_IMPL_3(uniform2f, long, float, float) + +void GraphicsContext3DInternal::uniform2fv(long location, float* v, int size) +{ + m_impl->uniform2fv(location, size, v); +} + +DELEGATE_TO_IMPL_3(uniform2i, long, int, int) + +void GraphicsContext3DInternal::uniform2iv(long location, int* v, int size) +{ + m_impl->uniform2iv(location, size, v); +} + +DELEGATE_TO_IMPL_4(uniform3f, long, float, float, float) + +void GraphicsContext3DInternal::uniform3fv(long location, float* v, int size) +{ + m_impl->uniform3fv(location, size, v); +} + +DELEGATE_TO_IMPL_4(uniform3i, long, int, int, int) + +void GraphicsContext3DInternal::uniform3iv(long location, int* v, int size) +{ + m_impl->uniform3iv(location, size, v); +} + +DELEGATE_TO_IMPL_5(uniform4f, long, float, float, float, float) + +void GraphicsContext3DInternal::uniform4fv(long location, float* v, int size) +{ + m_impl->uniform4fv(location, size, v); +} + +DELEGATE_TO_IMPL_5(uniform4i, long, int, int, int, int) + +void GraphicsContext3DInternal::uniform4iv(long location, int* v, int size) +{ + m_impl->uniform4iv(location, size, v); +} + +void GraphicsContext3DInternal::uniformMatrix2fv(long location, bool transpose, float* value, int size) +{ + m_impl->uniformMatrix2fv(location, size, transpose, value); +} + +void GraphicsContext3DInternal::uniformMatrix3fv(long location, bool transpose, float* value, int size) +{ + m_impl->uniformMatrix3fv(location, size, transpose, value); +} + +void GraphicsContext3DInternal::uniformMatrix4fv(long location, bool transpose, float* value, int size) +{ + m_impl->uniformMatrix4fv(location, size, transpose, value); +} + +DELEGATE_TO_IMPL_1(useProgram, Platform3DObject) +DELEGATE_TO_IMPL_1(validateProgram, Platform3DObject) + +DELEGATE_TO_IMPL_2(vertexAttrib1f, unsigned long, float) +DELEGATE_TO_IMPL_2(vertexAttrib1fv, unsigned long, float*) +DELEGATE_TO_IMPL_3(vertexAttrib2f, unsigned long, float, float) +DELEGATE_TO_IMPL_2(vertexAttrib2fv, unsigned long, float*) +DELEGATE_TO_IMPL_4(vertexAttrib3f, unsigned long, float, float, float) +DELEGATE_TO_IMPL_2(vertexAttrib3fv, unsigned long, float*) +DELEGATE_TO_IMPL_5(vertexAttrib4f, unsigned long, float, float, float, float) +DELEGATE_TO_IMPL_2(vertexAttrib4fv, unsigned long, float*) +DELEGATE_TO_IMPL_6(vertexAttribPointer, unsigned long, int, int, bool, unsigned long, unsigned long) + +DELEGATE_TO_IMPL_4(viewport, long, long, unsigned long, unsigned long) + +DELEGATE_TO_IMPL_R(createBuffer, unsigned) +DELEGATE_TO_IMPL_R(createFramebuffer, unsigned) +DELEGATE_TO_IMPL_R(createProgram, unsigned) +DELEGATE_TO_IMPL_R(createRenderbuffer, unsigned) +DELEGATE_TO_IMPL_1R(createShader, unsigned long, unsigned) +DELEGATE_TO_IMPL_R(createTexture, unsigned) + +DELEGATE_TO_IMPL_1(deleteBuffer, unsigned) +DELEGATE_TO_IMPL_1(deleteFramebuffer, unsigned) +DELEGATE_TO_IMPL_1(deleteProgram, unsigned) +DELEGATE_TO_IMPL_1(deleteRenderbuffer, unsigned) +DELEGATE_TO_IMPL_1(deleteShader, unsigned) +DELEGATE_TO_IMPL_1(deleteTexture, unsigned) + +DELEGATE_TO_IMPL_1(synthesizeGLError, unsigned long) + +Extensions3D* GraphicsContext3DInternal::getExtensions() +{ + if (!m_extensions) + m_extensions = adoptPtr(new Extensions3DChromium(this)); + return m_extensions.get(); +} + +bool GraphicsContext3DInternal::supportsExtension(const String& name) +{ + if (!m_initializedAvailableExtensions) { + String extensionsString = getString(GraphicsContext3D::EXTENSIONS); + Vector<String> availableExtensions; + extensionsString.split(" ", availableExtensions); + for (size_t i = 0; i < availableExtensions.size(); ++i) + m_availableExtensions.add(availableExtensions[i]); + m_initializedAvailableExtensions = true; + } + return m_availableExtensions.contains(name); +} + +DELEGATE_TO_IMPL_4R(mapBufferSubDataCHROMIUM, unsigned, int, int, unsigned, void*) +DELEGATE_TO_IMPL_1(unmapBufferSubDataCHROMIUM, const void*) +DELEGATE_TO_IMPL_9R(mapTexSubImage2DCHROMIUM, unsigned, int, int, int, int, int, unsigned, unsigned, unsigned, void*) +DELEGATE_TO_IMPL_1(unmapTexSubImage2DCHROMIUM, const void*) +DELEGATE_TO_IMPL_2(copyTextureToParentTextureCHROMIUM, unsigned, unsigned) + +//---------------------------------------------------------------------- +// GraphicsContext3D +// + +// Macros to assist in delegating from GraphicsContext3D to +// GraphicsContext3DInternal. + +#define DELEGATE_TO_INTERNAL(name) \ +void GraphicsContext3D::name() \ +{ \ + m_internal->name(); \ +} + +#define DELEGATE_TO_INTERNAL_R(name, rt) \ +rt GraphicsContext3D::name() \ +{ \ + return m_internal->name(); \ +} + +#define DELEGATE_TO_INTERNAL_1(name, t1) \ +void GraphicsContext3D::name(t1 a1) \ +{ \ + m_internal->name(a1); \ +} + +#define DELEGATE_TO_INTERNAL_1R(name, t1, rt) \ +rt GraphicsContext3D::name(t1 a1) \ +{ \ + return m_internal->name(a1); \ +} + +#define DELEGATE_TO_INTERNAL_2(name, t1, t2) \ +void GraphicsContext3D::name(t1 a1, t2 a2) \ +{ \ + m_internal->name(a1, a2); \ +} + +#define DELEGATE_TO_INTERNAL_2R(name, t1, t2, rt) \ +rt GraphicsContext3D::name(t1 a1, t2 a2) \ +{ \ + return m_internal->name(a1, a2); \ +} + +#define DELEGATE_TO_INTERNAL_3(name, t1, t2, t3) \ +void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \ +{ \ + m_internal->name(a1, a2, a3); \ +} + +#define DELEGATE_TO_INTERNAL_3R(name, t1, t2, t3, rt) \ +rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \ +{ \ + return m_internal->name(a1, a2, a3); \ +} + +#define DELEGATE_TO_INTERNAL_4(name, t1, t2, t3, t4) \ +void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \ +{ \ + m_internal->name(a1, a2, a3, a4); \ +} + +#define DELEGATE_TO_INTERNAL_4R(name, t1, t2, t3, t4, rt) \ +rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \ +{ \ + return m_internal->name(a1, a2, a3, a4); \ +} + +#define DELEGATE_TO_INTERNAL_5(name, t1, t2, t3, t4, t5) \ +void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \ +{ \ + m_internal->name(a1, a2, a3, a4, a5); \ +} + +#define DELEGATE_TO_INTERNAL_6(name, t1, t2, t3, t4, t5, t6) \ +void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ +{ \ + m_internal->name(a1, a2, a3, a4, a5, a6); \ +} + +#define DELEGATE_TO_INTERNAL_6R(name, t1, t2, t3, t4, t5, t6, rt) \ +rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ +{ \ + return m_internal->name(a1, a2, a3, a4, a5, a6); \ +} + +#define DELEGATE_TO_INTERNAL_7(name, t1, t2, t3, t4, t5, t6, t7) \ +void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \ +{ \ + m_internal->name(a1, a2, a3, a4, a5, a6, a7); \ +} + +#define DELEGATE_TO_INTERNAL_7R(name, t1, t2, t3, t4, t5, t6, t7, rt) \ +rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \ +{ \ + return m_internal->name(a1, a2, a3, a4, a5, a6, a7); \ +} + +#define DELEGATE_TO_INTERNAL_8(name, t1, t2, t3, t4, t5, t6, t7, t8) \ +void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) \ +{ \ + m_internal->name(a1, a2, a3, a4, a5, a6, a7, a8); \ +} + +#define DELEGATE_TO_INTERNAL_9R(name, t1, t2, t3, t4, t5, t6, t7, t8, t9, rt) \ +rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8, t9 a9) \ +{ \ + return m_internal->name(a1, a2, a3, a4, a5, a6, a7, a8, a9); \ +} + +GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes, HostWindow*, bool) +{ +} + +GraphicsContext3D::~GraphicsContext3D() +{ +} + +PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle) +{ + OwnPtr<GraphicsContext3DInternal> internal = adoptPtr(new GraphicsContext3DInternal()); + if (!internal->initialize(attrs, hostWindow, renderStyle == RenderDirectlyToHostWindow)) { + return 0; + } + RefPtr<GraphicsContext3D> result = adoptRef(new GraphicsContext3D(attrs, hostWindow, renderStyle == RenderDirectlyToHostWindow)); + result->m_internal = internal.release(); + return result.release(); +} + +PlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D() const +{ + return m_internal->platformGraphicsContext3D(); +} + +Platform3DObject GraphicsContext3D::platformTexture() const +{ + return m_internal->platformTexture(); +} + +void GraphicsContext3D::prepareTexture() +{ + return m_internal->prepareTexture(); +} + +#if USE(ACCELERATED_COMPOSITING) +PlatformLayer* GraphicsContext3D::platformLayer() const +{ + WebGLLayerChromium* canvasLayer = m_internal->platformLayer(); + canvasLayer->setContext(this); + return canvasLayer; +} +#endif + +DELEGATE_TO_INTERNAL(makeContextCurrent) +DELEGATE_TO_INTERNAL_1R(sizeInBytes, int, int) +DELEGATE_TO_INTERNAL_2(reshape, int, int) + +DELEGATE_TO_INTERNAL_1(activeTexture, unsigned long) +DELEGATE_TO_INTERNAL_2(attachShader, Platform3DObject, Platform3DObject) +DELEGATE_TO_INTERNAL_3(bindAttribLocation, Platform3DObject, unsigned long, const String&) + +DELEGATE_TO_INTERNAL_2(bindBuffer, unsigned long, Platform3DObject) +DELEGATE_TO_INTERNAL_2(bindFramebuffer, unsigned long, Platform3DObject) +DELEGATE_TO_INTERNAL_2(bindRenderbuffer, unsigned long, Platform3DObject) +DELEGATE_TO_INTERNAL_2(bindTexture, unsigned long, Platform3DObject) +DELEGATE_TO_INTERNAL_4(blendColor, double, double, double, double) +DELEGATE_TO_INTERNAL_1(blendEquation, unsigned long) +DELEGATE_TO_INTERNAL_2(blendEquationSeparate, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_2(blendFunc, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_4(blendFuncSeparate, unsigned long, unsigned long, unsigned long, unsigned long) + +DELEGATE_TO_INTERNAL_3(bufferData, unsigned long, int, unsigned long) +DELEGATE_TO_INTERNAL_4(bufferData, unsigned long, int, const void*, unsigned long) +DELEGATE_TO_INTERNAL_4(bufferSubData, unsigned long, long, int, const void*) + +DELEGATE_TO_INTERNAL_1R(checkFramebufferStatus, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_1(clear, unsigned long) +DELEGATE_TO_INTERNAL_4(clearColor, double, double, double, double) +DELEGATE_TO_INTERNAL_1(clearDepth, double) +DELEGATE_TO_INTERNAL_1(clearStencil, long) +DELEGATE_TO_INTERNAL_4(colorMask, bool, bool, bool, bool) +DELEGATE_TO_INTERNAL_1(compileShader, Platform3DObject) + +DELEGATE_TO_INTERNAL_8(copyTexImage2D, unsigned long, long, unsigned long, long, long, unsigned long, unsigned long, long) +DELEGATE_TO_INTERNAL_8(copyTexSubImage2D, unsigned long, long, long, long, long, long, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_1(cullFace, unsigned long) +DELEGATE_TO_INTERNAL_1(depthFunc, unsigned long) +DELEGATE_TO_INTERNAL_1(depthMask, bool) +DELEGATE_TO_INTERNAL_2(depthRange, double, double) +DELEGATE_TO_INTERNAL_2(detachShader, Platform3DObject, Platform3DObject) +DELEGATE_TO_INTERNAL_1(disable, unsigned long) +DELEGATE_TO_INTERNAL_1(disableVertexAttribArray, unsigned long) +DELEGATE_TO_INTERNAL_3(drawArrays, unsigned long, long, long) +DELEGATE_TO_INTERNAL_4(drawElements, unsigned long, unsigned long, unsigned long, long) + +DELEGATE_TO_INTERNAL_1(enable, unsigned long) +DELEGATE_TO_INTERNAL_1(enableVertexAttribArray, unsigned long) +DELEGATE_TO_INTERNAL(finish) +DELEGATE_TO_INTERNAL(flush) +DELEGATE_TO_INTERNAL_4(framebufferRenderbuffer, unsigned long, unsigned long, unsigned long, Platform3DObject) +DELEGATE_TO_INTERNAL_5(framebufferTexture2D, unsigned long, unsigned long, unsigned long, Platform3DObject, long) +DELEGATE_TO_INTERNAL_1(frontFace, unsigned long) +DELEGATE_TO_INTERNAL_1(generateMipmap, unsigned long) + +DELEGATE_TO_INTERNAL_3R(getActiveAttrib, Platform3DObject, unsigned long, ActiveInfo&, bool) +DELEGATE_TO_INTERNAL_3R(getActiveUniform, Platform3DObject, unsigned long, ActiveInfo&, bool) + +DELEGATE_TO_INTERNAL_4(getAttachedShaders, Platform3DObject, int, int*, unsigned int*) + +DELEGATE_TO_INTERNAL_2R(getAttribLocation, Platform3DObject, const String&, int) + +DELEGATE_TO_INTERNAL_2(getBooleanv, unsigned long, unsigned char*) + +DELEGATE_TO_INTERNAL_3(getBufferParameteriv, unsigned long, unsigned long, int*) + +DELEGATE_TO_INTERNAL_R(getContextAttributes, GraphicsContext3D::Attributes) + +DELEGATE_TO_INTERNAL_R(getError, unsigned long) + +DELEGATE_TO_INTERNAL_2(getFloatv, unsigned long, float*) + +DELEGATE_TO_INTERNAL_4(getFramebufferAttachmentParameteriv, unsigned long, unsigned long, unsigned long, int*) + +DELEGATE_TO_INTERNAL_2(getIntegerv, unsigned long, int*) + +DELEGATE_TO_INTERNAL_3(getProgramiv, Platform3DObject, unsigned long, int*) + +DELEGATE_TO_INTERNAL_1R(getProgramInfoLog, Platform3DObject, String) + +DELEGATE_TO_INTERNAL_3(getRenderbufferParameteriv, unsigned long, unsigned long, int*) + +DELEGATE_TO_INTERNAL_3(getShaderiv, Platform3DObject, unsigned long, int*) + +DELEGATE_TO_INTERNAL_1R(getShaderInfoLog, Platform3DObject, String) + +DELEGATE_TO_INTERNAL_1R(getShaderSource, Platform3DObject, String) +DELEGATE_TO_INTERNAL_1R(getString, unsigned long, String) + +DELEGATE_TO_INTERNAL_3(getTexParameterfv, unsigned long, unsigned long, float*) +DELEGATE_TO_INTERNAL_3(getTexParameteriv, unsigned long, unsigned long, int*) + +DELEGATE_TO_INTERNAL_3(getUniformfv, Platform3DObject, long, float*) +DELEGATE_TO_INTERNAL_3(getUniformiv, Platform3DObject, long, int*) + +DELEGATE_TO_INTERNAL_2R(getUniformLocation, Platform3DObject, const String&, long) + +DELEGATE_TO_INTERNAL_3(getVertexAttribfv, unsigned long, unsigned long, float*) +DELEGATE_TO_INTERNAL_3(getVertexAttribiv, unsigned long, unsigned long, int*) + +DELEGATE_TO_INTERNAL_2R(getVertexAttribOffset, unsigned long, unsigned long, long) + +DELEGATE_TO_INTERNAL_2(hint, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_1R(isBuffer, Platform3DObject, bool) +DELEGATE_TO_INTERNAL_1R(isEnabled, unsigned long, bool) +DELEGATE_TO_INTERNAL_1R(isFramebuffer, Platform3DObject, bool) +DELEGATE_TO_INTERNAL_1R(isProgram, Platform3DObject, bool) +DELEGATE_TO_INTERNAL_1R(isRenderbuffer, Platform3DObject, bool) +DELEGATE_TO_INTERNAL_1R(isShader, Platform3DObject, bool) +DELEGATE_TO_INTERNAL_1R(isTexture, Platform3DObject, bool) +DELEGATE_TO_INTERNAL_1(lineWidth, double) +DELEGATE_TO_INTERNAL_1(linkProgram, Platform3DObject) +DELEGATE_TO_INTERNAL_2(pixelStorei, unsigned long, long) +DELEGATE_TO_INTERNAL_2(polygonOffset, double, double) + +DELEGATE_TO_INTERNAL_7(readPixels, long, long, unsigned long, unsigned long, unsigned long, unsigned long, void*) + +DELEGATE_TO_INTERNAL(releaseShaderCompiler) +DELEGATE_TO_INTERNAL_4(renderbufferStorage, unsigned long, unsigned long, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_2(sampleCoverage, double, bool) +DELEGATE_TO_INTERNAL_4(scissor, long, long, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_2(shaderSource, Platform3DObject, const String&) +DELEGATE_TO_INTERNAL_3(stencilFunc, unsigned long, long, unsigned long) +DELEGATE_TO_INTERNAL_4(stencilFuncSeparate, unsigned long, unsigned long, long, unsigned long) +DELEGATE_TO_INTERNAL_1(stencilMask, unsigned long) +DELEGATE_TO_INTERNAL_2(stencilMaskSeparate, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_3(stencilOp, unsigned long, unsigned long, unsigned long) +DELEGATE_TO_INTERNAL_4(stencilOpSeparate, unsigned long, unsigned long, unsigned long, unsigned long) + +DELEGATE_TO_INTERNAL_9R(texImage2D, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, void*, int) +DELEGATE_TO_INTERNAL_3(texParameterf, unsigned, unsigned, float) +DELEGATE_TO_INTERNAL_3(texParameteri, unsigned, unsigned, int) +DELEGATE_TO_INTERNAL_9R(texSubImage2D, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, void*, int) + +DELEGATE_TO_INTERNAL_2(uniform1f, long, float) +DELEGATE_TO_INTERNAL_3(uniform1fv, long, float*, int) +DELEGATE_TO_INTERNAL_2(uniform1i, long, int) +DELEGATE_TO_INTERNAL_3(uniform1iv, long, int*, int) +DELEGATE_TO_INTERNAL_3(uniform2f, long, float, float) +DELEGATE_TO_INTERNAL_3(uniform2fv, long, float*, int) +DELEGATE_TO_INTERNAL_3(uniform2i, long, int, int) +DELEGATE_TO_INTERNAL_3(uniform2iv, long, int*, int) +DELEGATE_TO_INTERNAL_4(uniform3f, long, float, float, float) +DELEGATE_TO_INTERNAL_3(uniform3fv, long, float*, int) +DELEGATE_TO_INTERNAL_4(uniform3i, long, int, int, int) +DELEGATE_TO_INTERNAL_3(uniform3iv, long, int*, int) +DELEGATE_TO_INTERNAL_5(uniform4f, long, float, float, float, float) +DELEGATE_TO_INTERNAL_3(uniform4fv, long, float*, int) +DELEGATE_TO_INTERNAL_5(uniform4i, long, int, int, int, int) +DELEGATE_TO_INTERNAL_3(uniform4iv, long, int*, int) +DELEGATE_TO_INTERNAL_4(uniformMatrix2fv, long, bool, float*, int) +DELEGATE_TO_INTERNAL_4(uniformMatrix3fv, long, bool, float*, int) +DELEGATE_TO_INTERNAL_4(uniformMatrix4fv, long, bool, float*, int) + +DELEGATE_TO_INTERNAL_1(useProgram, Platform3DObject) +DELEGATE_TO_INTERNAL_1(validateProgram, Platform3DObject) + +DELEGATE_TO_INTERNAL_2(vertexAttrib1f, unsigned long, float) +DELEGATE_TO_INTERNAL_2(vertexAttrib1fv, unsigned long, float*) +DELEGATE_TO_INTERNAL_3(vertexAttrib2f, unsigned long, float, float) +DELEGATE_TO_INTERNAL_2(vertexAttrib2fv, unsigned long, float*) +DELEGATE_TO_INTERNAL_4(vertexAttrib3f, unsigned long, float, float, float) +DELEGATE_TO_INTERNAL_2(vertexAttrib3fv, unsigned long, float*) +DELEGATE_TO_INTERNAL_5(vertexAttrib4f, unsigned long, float, float, float, float) +DELEGATE_TO_INTERNAL_2(vertexAttrib4fv, unsigned long, float*) +DELEGATE_TO_INTERNAL_6(vertexAttribPointer, unsigned long, int, int, bool, unsigned long, unsigned long) + +DELEGATE_TO_INTERNAL_4(viewport, long, long, unsigned long, unsigned long) + +DELEGATE_TO_INTERNAL_1(paintRenderingResultsToCanvas, CanvasRenderingContext*) + +bool GraphicsContext3D::paintsIntoCanvasBuffer() const +{ + return m_internal->paintsIntoCanvasBuffer(); +} + +DELEGATE_TO_INTERNAL_R(createBuffer, unsigned) +DELEGATE_TO_INTERNAL_R(createFramebuffer, unsigned) +DELEGATE_TO_INTERNAL_R(createProgram, unsigned) +DELEGATE_TO_INTERNAL_R(createRenderbuffer, unsigned) +DELEGATE_TO_INTERNAL_1R(createShader, unsigned long, unsigned) +DELEGATE_TO_INTERNAL_R(createTexture, unsigned) + +DELEGATE_TO_INTERNAL_1(deleteBuffer, unsigned) +DELEGATE_TO_INTERNAL_1(deleteFramebuffer, unsigned) +DELEGATE_TO_INTERNAL_1(deleteProgram, unsigned) +DELEGATE_TO_INTERNAL_1(deleteRenderbuffer, unsigned) +DELEGATE_TO_INTERNAL_1(deleteShader, unsigned) +DELEGATE_TO_INTERNAL_1(deleteTexture, unsigned) + +DELEGATE_TO_INTERNAL_1(synthesizeGLError, unsigned long) +DELEGATE_TO_INTERNAL_R(getExtensions, Extensions3D*) + +bool GraphicsContext3D::isGLES2Compliant() const +{ + return m_internal->isGLES2Compliant(); +} + +} // namespace WebCore + +#endif // ENABLE(3D_CANVAS) diff --git a/WebKit/chromium/src/GraphicsContext3DInternal.h b/WebKit/chromium/src/GraphicsContext3DInternal.h new file mode 100644 index 0000000..220cbb8 --- /dev/null +++ b/WebKit/chromium/src/GraphicsContext3DInternal.h @@ -0,0 +1,308 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef GraphicsContext3DInternal_h +#define GraphicsContext3DInternal_h + +#include "GraphicsContext3D.h" +#include <wtf/HashSet.h> +#include <wtf/OwnPtr.h> +#if PLATFORM(SKIA) +#include "SkBitmap.h" +#endif + +namespace WebKit { +class WebGraphicsContext3D; +class WebViewImpl; +} // namespace WebKit + +namespace WebCore { + +class Extensions3DChromium; +#if USE(ACCELERATED_COMPOSITING) +class WebGLLayerChromium; +#endif + +class GraphicsContext3DInternal { +public: + GraphicsContext3DInternal(); + ~GraphicsContext3DInternal(); + + bool initialize(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool renderDirectlyToHostWindow); + + // Helper function to provide access to the lower-level WebGraphicsContext3D, + // which is needed for subordinate contexts like WebGL's to share resources + // with the compositor's context. + static WebKit::WebGraphicsContext3D* extractWebGraphicsContext3D(GraphicsContext3D* context); + + PlatformGraphicsContext3D platformGraphicsContext3D() const; + Platform3DObject platformTexture() const; + + bool makeContextCurrent(); + + int sizeInBytes(int type); + + void reshape(int width, int height); + + void paintRenderingResultsToCanvas(CanvasRenderingContext*); + bool paintsIntoCanvasBuffer() const; + + void prepareTexture(); + +#if USE(ACCELERATED_COMPOSITING) + WebGLLayerChromium* platformLayer() const; +#endif + bool isGLES2Compliant() const; + + //---------------------------------------------------------------------- + // Entry points for WebGL. + // + void activeTexture(unsigned long texture); + void attachShader(Platform3DObject program, Platform3DObject shader); + void bindAttribLocation(Platform3DObject, unsigned long index, const String& name); + void bindBuffer(unsigned long target, Platform3DObject); + void bindFramebuffer(unsigned long target, Platform3DObject); + void bindRenderbuffer(unsigned long target, Platform3DObject); + void bindTexture(unsigned long target, Platform3DObject texture); + void blendColor(double red, double green, double blue, double alpha); + void blendEquation(unsigned long mode); + void blendEquationSeparate(unsigned long modeRGB, unsigned long modeAlpha); + void blendFunc(unsigned long sfactor, unsigned long dfactor); + void blendFuncSeparate(unsigned long srcRGB, unsigned long dstRGB, unsigned long srcAlpha, unsigned long dstAlpha); + + void bufferData(unsigned long target, int size, unsigned long usage); + void bufferData(unsigned long target, int size, const void* data, unsigned long usage); + void bufferSubData(unsigned long target, long offset, int size, const void* data); + + unsigned long checkFramebufferStatus(unsigned long target); + void clear(unsigned long mask); + void clearColor(double red, double green, double blue, double alpha); + void clearDepth(double depth); + void clearStencil(long s); + void colorMask(bool red, bool green, bool blue, bool alpha); + void compileShader(Platform3DObject); + + void copyTexImage2D(unsigned long target, long level, unsigned long internalformat, long x, long y, unsigned long width, unsigned long height, long border); + void copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, long x, long y, unsigned long width, unsigned long height); + void cullFace(unsigned long mode); + void depthFunc(unsigned long func); + void depthMask(bool flag); + void depthRange(double zNear, double zFar); + void detachShader(Platform3DObject, Platform3DObject); + void disable(unsigned long cap); + void disableVertexAttribArray(unsigned long index); + void drawArrays(unsigned long mode, long first, long count); + void drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset); + + void enable(unsigned long cap); + void enableVertexAttribArray(unsigned long index); + void finish(); + void flush(); + void framebufferRenderbuffer(unsigned long target, unsigned long attachment, unsigned long renderbuffertarget, Platform3DObject); + void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, Platform3DObject, long level); + void frontFace(unsigned long mode); + void generateMipmap(unsigned long target); + + bool getActiveAttrib(Platform3DObject program, unsigned long index, ActiveInfo&); + bool getActiveUniform(Platform3DObject program, unsigned long index, ActiveInfo&); + + void getAttachedShaders(Platform3DObject program, int maxCount, int* count, unsigned int* shaders); + + int getAttribLocation(Platform3DObject, const String& name); + + void getBooleanv(unsigned long pname, unsigned char* value); + + void getBufferParameteriv(unsigned long target, unsigned long pname, int* value); + + GraphicsContext3D::Attributes getContextAttributes(); + + unsigned long getError(); + + bool isContextLost(); + + void getFloatv(unsigned long pname, float* value); + + void getFramebufferAttachmentParameteriv(unsigned long target, unsigned long attachment, unsigned long pname, int* value); + + void getIntegerv(unsigned long pname, int* value); + + void getProgramiv(Platform3DObject program, unsigned long pname, int* value); + + String getProgramInfoLog(Platform3DObject); + + void getRenderbufferParameteriv(unsigned long target, unsigned long pname, int* value); + + void getShaderiv(Platform3DObject, unsigned long pname, int* value); + + String getShaderInfoLog(Platform3DObject); + + String getShaderSource(Platform3DObject); + String getString(unsigned long name); + + void getTexParameterfv(unsigned long target, unsigned long pname, float* value); + void getTexParameteriv(unsigned long target, unsigned long pname, int* value); + + void getUniformfv(Platform3DObject program, long location, float* value); + void getUniformiv(Platform3DObject program, long location, int* value); + + long getUniformLocation(Platform3DObject, const String& name); + + void getVertexAttribfv(unsigned long index, unsigned long pname, float* value); + void getVertexAttribiv(unsigned long index, unsigned long pname, int* value); + + long getVertexAttribOffset(unsigned long index, unsigned long pname); + + void hint(unsigned long target, unsigned long mode); + bool isBuffer(Platform3DObject); + bool isEnabled(unsigned long cap); + bool isFramebuffer(Platform3DObject); + bool isProgram(Platform3DObject); + bool isRenderbuffer(Platform3DObject); + bool isShader(Platform3DObject); + bool isTexture(Platform3DObject); + void lineWidth(double); + void linkProgram(Platform3DObject); + void pixelStorei(unsigned long pname, long param); + void polygonOffset(double factor, double units); + + void readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* data); + + void releaseShaderCompiler(); + void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height); + void sampleCoverage(double value, bool invert); + void scissor(long x, long y, unsigned long width, unsigned long height); + void shaderSource(Platform3DObject, const String& string); + void stencilFunc(unsigned long func, long ref, unsigned long mask); + void stencilFuncSeparate(unsigned long face, unsigned long func, long ref, unsigned long mask); + void stencilMask(unsigned long mask); + void stencilMaskSeparate(unsigned long face, unsigned long mask); + void stencilOp(unsigned long fail, unsigned long zfail, unsigned long zpass); + void stencilOpSeparate(unsigned long face, unsigned long fail, unsigned long zfail, unsigned long zpass); + + // These next several functions return an error code (0 if no errors) rather than using an ExceptionCode. + // Currently they return -1 on any error. + int texImage2D(unsigned target, unsigned level, unsigned internalformat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, void* pixels); + + void texParameterf(unsigned target, unsigned pname, float param); + void texParameteri(unsigned target, unsigned pname, int param); + + int texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, unsigned format, unsigned type, void* pixels); + + void uniform1f(long location, float x); + void uniform1fv(long location, float* v, int size); + void uniform1i(long location, int x); + void uniform1iv(long location, int* v, int size); + void uniform2f(long location, float x, float y); + void uniform2fv(long location, float* v, int size); + void uniform2i(long location, int x, int y); + void uniform2iv(long location, int* v, int size); + void uniform3f(long location, float x, float y, float z); + void uniform3fv(long location, float* v, int size); + void uniform3i(long location, int x, int y, int z); + void uniform3iv(long location, int* v, int size); + void uniform4f(long location, float x, float y, float z, float w); + void uniform4fv(long location, float* v, int size); + void uniform4i(long location, int x, int y, int z, int w); + void uniform4iv(long location, int* v, int size); + void uniformMatrix2fv(long location, bool transpose, float* value, int size); + void uniformMatrix3fv(long location, bool transpose, float* value, int size); + void uniformMatrix4fv(long location, bool transpose, float* value, int size); + + void useProgram(Platform3DObject); + void validateProgram(Platform3DObject); + + void vertexAttrib1f(unsigned long indx, float x); + void vertexAttrib1fv(unsigned long indx, float* values); + void vertexAttrib2f(unsigned long indx, float x, float y); + void vertexAttrib2fv(unsigned long indx, float* values); + void vertexAttrib3f(unsigned long indx, float x, float y, float z); + void vertexAttrib3fv(unsigned long indx, float* values); + void vertexAttrib4f(unsigned long indx, float x, float y, float z, float w); + void vertexAttrib4fv(unsigned long indx, float* values); + void vertexAttribPointer(unsigned long indx, int size, int type, bool normalized, + unsigned long stride, unsigned long offset); + + void viewport(long x, long y, unsigned long width, unsigned long height); + + unsigned createBuffer(); + unsigned createFramebuffer(); + unsigned createProgram(); + unsigned createRenderbuffer(); + unsigned createShader(unsigned long); + unsigned createTexture(); + + void deleteBuffer(unsigned); + void deleteFramebuffer(unsigned); + void deleteProgram(unsigned); + void deleteRenderbuffer(unsigned); + void deleteShader(unsigned); + void deleteTexture(unsigned); + + void synthesizeGLError(unsigned long error); + + // Extensions3D support. + Extensions3D* getExtensions(); + bool supportsExtension(const String& name); + + // EXT_texture_format_BGRA8888 + bool supportsBGRA(); + + // GL_CHROMIUM_map_sub + bool supportsMapSubCHROMIUM(); + void* mapBufferSubDataCHROMIUM(unsigned target, int offset, int size, unsigned access); + void unmapBufferSubDataCHROMIUM(const void*); + void* mapTexSubImage2DCHROMIUM(unsigned target, int level, int xoffset, int yoffset, int width, int height, unsigned format, unsigned type, unsigned access); + void unmapTexSubImage2DCHROMIUM(const void*); + + // GL_CHROMIUM_copy_texture_to_parent_texture + bool supportsCopyTextureToParentTextureCHROMIUM(); + void copyTextureToParentTextureCHROMIUM(unsigned texture, unsigned parentTexture); + +private: + OwnPtr<WebKit::WebGraphicsContext3D> m_impl; + OwnPtr<Extensions3DChromium> m_extensions; + WebKit::WebViewImpl* m_webViewImpl; + bool m_initializedAvailableExtensions; + HashSet<String> m_availableExtensions; +#if USE(ACCELERATED_COMPOSITING) + RefPtr<WebGLLayerChromium> m_compositingLayer; +#endif +#if PLATFORM(SKIA) + // If the width and height of the Canvas's backing store don't + // match those that we were given in the most recent call to + // reshape(), then we need an intermediate bitmap to read back the + // frame buffer into. This seems to happen when CSS styles are + // used to resize the Canvas. + SkBitmap m_resizingBitmap; +#endif + +#if PLATFORM(CG) + unsigned char* m_renderOutput; +#endif +}; + +} // namespace WebCore + +#endif // GraphicsContext3D_h diff --git a/WebKit/chromium/src/IDBCallbacksProxy.cpp b/WebKit/chromium/src/IDBCallbacksProxy.cpp new file mode 100644 index 0000000..69051d0 --- /dev/null +++ b/WebKit/chromium/src/IDBCallbacksProxy.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2010 Google 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "IDBCallbacksProxy.h" + +#include "IDBDatabaseError.h" +#include "IDBDatabaseProxy.h" +#include "WebIDBCallbacks.h" +#include "WebIDBCursorImpl.h" +#include "WebIDBDatabaseImpl.h" +#include "WebIDBDatabaseError.h" +#include "WebIDBIndexImpl.h" +#include "WebIDBKey.h" +#include "WebIDBObjectStoreImpl.h" +#include "WebIDBTransactionImpl.h" +#include "WebSerializedScriptValue.h" + +#if ENABLE(INDEXED_DATABASE) + +namespace WebCore { + +PassRefPtr<IDBCallbacksProxy> IDBCallbacksProxy::create(PassOwnPtr<WebKit::WebIDBCallbacks> callbacks) +{ + return adoptRef(new IDBCallbacksProxy(callbacks)); +} + +IDBCallbacksProxy::IDBCallbacksProxy(PassOwnPtr<WebKit::WebIDBCallbacks> callbacks) + : m_callbacks(callbacks) +{ +} + +IDBCallbacksProxy::~IDBCallbacksProxy() +{ +} + +void IDBCallbacksProxy::onError(PassRefPtr<IDBDatabaseError> idbDatabaseError) +{ + m_callbacks->onError(WebKit::WebIDBDatabaseError(idbDatabaseError)); + m_callbacks.clear(); +} + +void IDBCallbacksProxy::onSuccess() +{ + m_callbacks->onSuccess(); + m_callbacks.clear(); +} + +void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBCursorBackendInterface> idbCursorBackend) +{ + m_callbacks->onSuccess(new WebKit::WebIDBCursorImpl(idbCursorBackend)); + m_callbacks.clear(); +} + +void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBDatabaseBackendInterface> backend) +{ + m_callbacks->onSuccess(new WebKit::WebIDBDatabaseImpl(backend)); + m_callbacks.clear(); +} + +void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBIndexBackendInterface> backend) +{ + m_callbacks->onSuccess(new WebKit::WebIDBIndexImpl(backend)); + m_callbacks.clear(); +} + +void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBKey> idbKey) +{ + m_callbacks->onSuccess(WebKit::WebIDBKey(idbKey)); + m_callbacks.clear(); +} + +void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBObjectStoreBackendInterface> backend) +{ + m_callbacks->onSuccess(new WebKit::WebIDBObjectStoreImpl(backend)); + m_callbacks.clear(); +} + +void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBTransactionBackendInterface> backend) +{ + m_callbacks->onSuccess(new WebKit::WebIDBTransactionImpl(backend)); + m_callbacks.clear(); +} + +void IDBCallbacksProxy::onSuccess(PassRefPtr<SerializedScriptValue> serializedScriptValue) +{ + m_callbacks->onSuccess(WebKit::WebSerializedScriptValue(serializedScriptValue)); + m_callbacks.clear(); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/IDBCallbacksProxy.h b/WebKit/chromium/src/IDBCallbacksProxy.h new file mode 100644 index 0000000..8c26161 --- /dev/null +++ b/WebKit/chromium/src/IDBCallbacksProxy.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2010 Google 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef IDBCallbacksProxy_h +#define IDBCallbacksProxy_h + +#include "IDBCallbacks.h" +#include <wtf/PassOwnPtr.h> +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +#if ENABLE(INDEXED_DATABASE) + +namespace WebKit { +class WebIDBCallbacks; +} + +namespace WebCore { + +class IDBCallbacksProxy : public IDBCallbacks { +public: + static PassRefPtr<IDBCallbacksProxy> create(PassOwnPtr<WebKit::WebIDBCallbacks>); + virtual ~IDBCallbacksProxy(); + + virtual void onError(PassRefPtr<IDBDatabaseError>); + virtual void onSuccess(); // For "null". + virtual void onSuccess(PassRefPtr<IDBCursorBackendInterface>); + virtual void onSuccess(PassRefPtr<IDBDatabaseBackendInterface>); + virtual void onSuccess(PassRefPtr<IDBIndexBackendInterface>); + virtual void onSuccess(PassRefPtr<IDBKey>); + virtual void onSuccess(PassRefPtr<IDBObjectStoreBackendInterface>); + virtual void onSuccess(PassRefPtr<IDBTransactionBackendInterface>); + virtual void onSuccess(PassRefPtr<SerializedScriptValue>); + +private: + IDBCallbacksProxy(PassOwnPtr<WebKit::WebIDBCallbacks>); + + OwnPtr<WebKit::WebIDBCallbacks> m_callbacks; +}; + + +} // namespace WebCore + +#endif + +#endif // IDBCallbacksProxy_h diff --git a/WebKit/chromium/src/IDBCursorBackendProxy.cpp b/WebKit/chromium/src/IDBCursorBackendProxy.cpp new file mode 100644 index 0000000..94491f9 --- /dev/null +++ b/WebKit/chromium/src/IDBCursorBackendProxy.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "IDBCursorBackendProxy.h" + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBAny.h" +#include "IDBCallbacks.h" +#include "IDBKey.h" +#include "SerializedScriptValue.h" +#include "WebIDBCallbacksImpl.h" +#include "WebIDBKey.h" +#include "WebSerializedScriptValue.h" + +namespace WebCore { + +PassRefPtr<IDBCursorBackendInterface> IDBCursorBackendProxy::create(PassOwnPtr<WebKit::WebIDBCursor> idbCursor) +{ + return adoptRef(new IDBCursorBackendProxy(idbCursor)); +} + +IDBCursorBackendProxy::IDBCursorBackendProxy(PassOwnPtr<WebKit::WebIDBCursor> idbCursor) + : m_idbCursor(idbCursor) +{ +} + +IDBCursorBackendProxy::~IDBCursorBackendProxy() +{ +} + +unsigned short IDBCursorBackendProxy::direction() const +{ + return m_idbCursor->direction(); +} + +PassRefPtr<IDBKey> IDBCursorBackendProxy::key() const +{ + return m_idbCursor->key(); +} + +PassRefPtr<IDBAny> IDBCursorBackendProxy::value() const +{ + WebKit::WebSerializedScriptValue webScriptValue; + WebKit::WebIDBKey webKey; + m_idbCursor->value(webScriptValue, webKey); + if (!webScriptValue.isNull()) { + ASSERT(webKey.type() == WebKit::WebIDBKey::InvalidType); + return IDBAny::create<SerializedScriptValue>(webScriptValue); + } + ASSERT(webKey.type() != WebKit::WebIDBKey::InvalidType); + return IDBAny::create<IDBKey>(webKey); +} + +void IDBCursorBackendProxy::update(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec) +{ + m_idbCursor->update(value, new WebIDBCallbacksImpl(callbacks), ec); +} + +void IDBCursorBackendProxy::continueFunction(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec) +{ + m_idbCursor->continueFunction(key, new WebIDBCallbacksImpl(callbacks), ec); +} + +void IDBCursorBackendProxy::remove(PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec) +{ + m_idbCursor->remove(new WebIDBCallbacksImpl(callbacks), ec); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/IDBCursorBackendProxy.h b/WebKit/chromium/src/IDBCursorBackendProxy.h new file mode 100644 index 0000000..0a7a288 --- /dev/null +++ b/WebKit/chromium/src/IDBCursorBackendProxy.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef IDBCursorBackendProxy_h +#define IDBCursorBackendProxy_h + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBCursorBackendInterface.h" +#include "WebIDBCursor.h" +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { + +class IDBCursorBackendProxy : public IDBCursorBackendInterface { +public: + static PassRefPtr<IDBCursorBackendInterface> create(PassOwnPtr<WebKit::WebIDBCursor>); + virtual ~IDBCursorBackendProxy(); + + virtual unsigned short direction() const; + virtual PassRefPtr<IDBKey> key() const; + virtual PassRefPtr<IDBAny> value() const; + virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>, ExceptionCode&); + virtual void continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, ExceptionCode&); + virtual void remove(PassRefPtr<IDBCallbacks>, ExceptionCode&); + +private: + IDBCursorBackendProxy(PassOwnPtr<WebKit::WebIDBCursor>); + + OwnPtr<WebKit::WebIDBCursor> m_idbCursor; +}; + +} // namespace WebCore + +#endif + +#endif // IDBCursorBackendProxy_h diff --git a/WebKit/chromium/src/IDBDatabaseProxy.cpp b/WebKit/chromium/src/IDBDatabaseProxy.cpp new file mode 100644 index 0000000..685f53c --- /dev/null +++ b/WebKit/chromium/src/IDBDatabaseProxy.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "IDBDatabaseProxy.h" + +#include "DOMStringList.h" +#include "IDBCallbacks.h" +#include "IDBObjectStoreProxy.h" +#include "IDBTransactionBackendProxy.h" +#include "WebDOMStringList.h" +#include "WebFrameImpl.h" +#include "WebIDBCallbacksImpl.h" +#include "WebIDBDatabase.h" +#include "WebIDBDatabaseError.h" +#include "WebIDBObjectStore.h" +#include "WebIDBTransaction.h" + +#if ENABLE(INDEXED_DATABASE) + +namespace WebCore { + +PassRefPtr<IDBDatabaseBackendInterface> IDBDatabaseProxy::create(PassOwnPtr<WebKit::WebIDBDatabase> database) +{ + return adoptRef(new IDBDatabaseProxy(database)); +} + +IDBDatabaseProxy::IDBDatabaseProxy(PassOwnPtr<WebKit::WebIDBDatabase> database) + : m_webIDBDatabase(database) +{ +} + +IDBDatabaseProxy::~IDBDatabaseProxy() +{ +} + +String IDBDatabaseProxy::name() const +{ + return m_webIDBDatabase->name(); +} + +String IDBDatabaseProxy::description() const +{ + return m_webIDBDatabase->description(); +} + +String IDBDatabaseProxy::version() const +{ + return m_webIDBDatabase->version(); +} + +PassRefPtr<DOMStringList> IDBDatabaseProxy::objectStoreNames() const +{ + return m_webIDBDatabase->objectStoreNames(); +} + +PassRefPtr<IDBObjectStoreBackendInterface> IDBDatabaseProxy::createObjectStore(const String& name, const String& keyPath, bool autoIncrement, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + WebKit::WebIDBObjectStore* objectStore = m_webIDBDatabase->createObjectStore(name, keyPath, autoIncrement, *transactionProxy->getWebIDBTransaction(), ec); + if (!objectStore) + return 0; + return IDBObjectStoreProxy::create(objectStore); +} + +void IDBDatabaseProxy::deleteObjectStore(const String& name, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBDatabase->deleteObjectStore(name, *transactionProxy->getWebIDBTransaction(), ec); +} + +void IDBDatabaseProxy::setVersion(const String& version, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec) +{ + m_webIDBDatabase->setVersion(version, new WebIDBCallbacksImpl(callbacks), ec); +} + +PassRefPtr<IDBTransactionBackendInterface> IDBDatabaseProxy::transaction(DOMStringList* storeNames, unsigned short mode, unsigned long timeout, ExceptionCode& ec) +{ + WebKit::WebDOMStringList names(storeNames); + WebKit::WebIDBTransaction* transaction = m_webIDBDatabase->transaction(names, mode, timeout, ec); + if (!transaction) { + ASSERT(ec); + return 0; + } + return IDBTransactionBackendProxy::create(transaction); +} + +void IDBDatabaseProxy::close() +{ + m_webIDBDatabase->close(); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/IDBDatabaseProxy.h b/WebKit/chromium/src/IDBDatabaseProxy.h new file mode 100644 index 0000000..84693f2 --- /dev/null +++ b/WebKit/chromium/src/IDBDatabaseProxy.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef IDBDatabaseProxy_h +#define IDBDatabaseProxy_h + +#include "IDBDatabaseBackendInterface.h" +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> +#include <wtf/PassRefPtr.h> + +#if ENABLE(INDEXED_DATABASE) + +namespace WebKit { class WebIDBDatabase; } + +namespace WebCore { + +class IDBDatabaseProxy : public IDBDatabaseBackendInterface { +public: + static PassRefPtr<IDBDatabaseBackendInterface> create(PassOwnPtr<WebKit::WebIDBDatabase>); + virtual ~IDBDatabaseProxy(); + + virtual String name() const; + virtual String description() const; + virtual String version() const; + virtual PassRefPtr<DOMStringList> objectStoreNames() const; + + virtual PassRefPtr<IDBObjectStoreBackendInterface> createObjectStore(const String& name, const String& keyPath, bool autoIncrement, IDBTransactionBackendInterface*, ExceptionCode&); + virtual void deleteObjectStore(const String& name, IDBTransactionBackendInterface*, ExceptionCode&); + virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, ExceptionCode&); + virtual PassRefPtr<IDBTransactionBackendInterface> transaction(DOMStringList* storeNames, unsigned short mode, unsigned long timeout, ExceptionCode&); + virtual void close(); + +private: + IDBDatabaseProxy(PassOwnPtr<WebKit::WebIDBDatabase>); + + OwnPtr<WebKit::WebIDBDatabase> m_webIDBDatabase; +}; + +} // namespace WebCore + +#endif + +#endif // IDBDatabaseProxy_h diff --git a/WebKit/chromium/src/IDBFactoryBackendProxy.cpp b/WebKit/chromium/src/IDBFactoryBackendProxy.cpp new file mode 100755 index 0000000..67504a3 --- /dev/null +++ b/WebKit/chromium/src/IDBFactoryBackendProxy.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2010 Google 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "IDBFactoryBackendProxy.h" + +#include "DOMStringList.h" +#include "IDBDatabaseError.h" +#include "IDBDatabaseProxy.h" +#include "WebFrameImpl.h" +#include "WebIDBCallbacksImpl.h" +#include "WebIDBDatabase.h" +#include "WebIDBDatabaseError.h" +#include "WebIDBFactory.h" +#include "WebKit.h" +#include "WebKitClient.h" +#include "WebVector.h" + +#if ENABLE(INDEXED_DATABASE) + +namespace WebCore { + +PassRefPtr<IDBFactoryBackendInterface> IDBFactoryBackendProxy::create() +{ + return adoptRef(new IDBFactoryBackendProxy()); +} + +IDBFactoryBackendProxy::IDBFactoryBackendProxy() + : m_webIDBFactory(WebKit::webKitClient()->idbFactory()) +{ +} + +IDBFactoryBackendProxy::~IDBFactoryBackendProxy() +{ +} + +void IDBFactoryBackendProxy::open(const String& name, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<SecurityOrigin> origin, Frame* frame, const String& dataDir, int64_t maximumSize) +{ + WebKit::WebFrame* webFrame = WebKit::WebFrameImpl::fromFrame(frame); + m_webIDBFactory->open(name, new WebIDBCallbacksImpl(callbacks), origin, webFrame, dataDir, maximumSize); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) + diff --git a/WebKit/chromium/src/IDBFactoryBackendProxy.h b/WebKit/chromium/src/IDBFactoryBackendProxy.h new file mode 100755 index 0000000..5950a68 --- /dev/null +++ b/WebKit/chromium/src/IDBFactoryBackendProxy.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2010 Google 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef IDBFactoryBackendProxy_h +#define IDBFactoryBackendProxy_h + +#include "IDBFactoryBackendInterface.h" + +#if ENABLE(INDEXED_DATABASE) + +namespace WebKit { class WebIDBFactory; } + +namespace WebCore { + +class DOMStringList; + +class IDBFactoryBackendProxy : public IDBFactoryBackendInterface { +public: + static PassRefPtr<IDBFactoryBackendInterface> create(); + virtual ~IDBFactoryBackendProxy(); + + PassRefPtr<DOMStringList> databases(void) const; + virtual void open(const String& name, PassRefPtr<IDBCallbacks>, PassRefPtr<SecurityOrigin>, Frame*, const String& dataDir, int64_t maximumSize); + +private: + IDBFactoryBackendProxy(); + + // We don't own this pointer (unlike all the other proxy classes which do). + WebKit::WebIDBFactory* m_webIDBFactory; +}; + +} // namespace WebCore + +#endif + +#endif // IDBFactoryBackendProxy_h + diff --git a/WebKit/chromium/src/IDBIndexBackendProxy.cpp b/WebKit/chromium/src/IDBIndexBackendProxy.cpp new file mode 100644 index 0000000..410750e --- /dev/null +++ b/WebKit/chromium/src/IDBIndexBackendProxy.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "IDBIndexBackendProxy.h" + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBCallbacks.h" +#include "IDBKeyRange.h" +#include "IDBTransactionBackendProxy.h" +#include "WebIDBCallbacksImpl.h" +#include "WebIDBDatabaseError.h" +#include "WebIDBIndex.h" +#include "WebIDBKey.h" +#include "WebIDBKeyRange.h" + +namespace WebCore { + +PassRefPtr<IDBIndexBackendInterface> IDBIndexBackendProxy::create(PassOwnPtr<WebKit::WebIDBIndex> index) +{ + return adoptRef(new IDBIndexBackendProxy(index)); +} + +IDBIndexBackendProxy::IDBIndexBackendProxy(PassOwnPtr<WebKit::WebIDBIndex> index) + : m_webIDBIndex(index) +{ +} + +IDBIndexBackendProxy::~IDBIndexBackendProxy() +{ +} + +String IDBIndexBackendProxy::name() +{ + return m_webIDBIndex->name(); +} + +String IDBIndexBackendProxy::storeName() +{ + return m_webIDBIndex->storeName(); +} + +String IDBIndexBackendProxy::keyPath() +{ + return m_webIDBIndex->keyPath(); +} + +bool IDBIndexBackendProxy::unique() +{ + return m_webIDBIndex->unique(); +} + +void IDBIndexBackendProxy::openCursor(PassRefPtr<IDBKeyRange> keyRange, unsigned short direction, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBIndex->openObjectCursor(keyRange, direction, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec); +} + +void IDBIndexBackendProxy::openKeyCursor(PassRefPtr<IDBKeyRange> keyRange, unsigned short direction, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBIndex->openKeyCursor(keyRange, direction, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec); +} + +void IDBIndexBackendProxy::get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBIndex->getObject(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec); +} + +void IDBIndexBackendProxy::getKey(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBIndex->getKey(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/IDBIndexBackendProxy.h b/WebKit/chromium/src/IDBIndexBackendProxy.h new file mode 100644 index 0000000..e9de05a --- /dev/null +++ b/WebKit/chromium/src/IDBIndexBackendProxy.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef IDBIndexBackendProxy_h +#define IDBIndexBackendProxy_h + +#include "IDBIndexBackendInterface.h" +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> + +#if ENABLE(INDEXED_DATABASE) + +namespace WebKit { class WebIDBIndex; } + +namespace WebCore { + +class IDBIndexBackendProxy : public IDBIndexBackendInterface { +public: + static PassRefPtr<IDBIndexBackendInterface> create(PassOwnPtr<WebKit::WebIDBIndex>); + virtual ~IDBIndexBackendProxy(); + + virtual String name(); + virtual String storeName(); + virtual String keyPath(); + virtual bool unique(); + + virtual void openCursor(PassRefPtr<IDBKeyRange>, unsigned short direction, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&); + virtual void openKeyCursor(PassRefPtr<IDBKeyRange>, unsigned short direction, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&); + virtual void get(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&); + virtual void getKey(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&); + +private: + IDBIndexBackendProxy(PassOwnPtr<WebKit::WebIDBIndex>); + + OwnPtr<WebKit::WebIDBIndex> m_webIDBIndex; +}; + +} // namespace WebCore + +#endif + +#endif // IDBIndexBackendProxy_h diff --git a/WebKit/chromium/src/IDBObjectStoreProxy.cpp b/WebKit/chromium/src/IDBObjectStoreProxy.cpp new file mode 100755 index 0000000..e03cdc8 --- /dev/null +++ b/WebKit/chromium/src/IDBObjectStoreProxy.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "IDBObjectStoreProxy.h" + +#include "DOMStringList.h" +#include "IDBCallbacks.h" +#include "IDBIndexBackendProxy.h" +#include "IDBKeyRange.h" +#include "IDBTransactionBackendProxy.h" +#include "WebIDBCallbacksImpl.h" +#include "WebIDBKeyRange.h" +#include "WebIDBIndex.h" +#include "WebIDBKey.h" +#include "WebIDBObjectStore.h" +#include "WebIDBTransactionImpl.h" +#include "WebSerializedScriptValue.h" + +#if ENABLE(INDEXED_DATABASE) + +namespace WebCore { + +PassRefPtr<IDBObjectStoreBackendInterface> IDBObjectStoreProxy::create(PassOwnPtr<WebKit::WebIDBObjectStore> objectStore) +{ + return adoptRef(new IDBObjectStoreProxy(objectStore)); +} + +IDBObjectStoreProxy::IDBObjectStoreProxy(PassOwnPtr<WebKit::WebIDBObjectStore> objectStore) + : m_webIDBObjectStore(objectStore) +{ +} + +IDBObjectStoreProxy::~IDBObjectStoreProxy() +{ +} + +String IDBObjectStoreProxy::name() const +{ + return m_webIDBObjectStore->name(); +} + +String IDBObjectStoreProxy::keyPath() const +{ + return m_webIDBObjectStore->keyPath(); +} + +PassRefPtr<DOMStringList> IDBObjectStoreProxy::indexNames() const +{ + return m_webIDBObjectStore->indexNames(); +} + +void IDBObjectStoreProxy::get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBObjectStore->get(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec); +} + +void IDBObjectStoreProxy::put(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, bool addOnly, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBObjectStore->put(value, key, addOnly, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec); +} + +void IDBObjectStoreProxy::deleteFunction(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBObjectStore->deleteFunction(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec); +} + +PassRefPtr<IDBIndexBackendInterface> IDBObjectStoreProxy::createIndex(const String& name, const String& keyPath, bool unique, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + WebKit::WebIDBIndex* index = m_webIDBObjectStore->createIndex(name, keyPath, unique, *transactionProxy->getWebIDBTransaction(), ec); + if (!index) + return 0; + return IDBIndexBackendProxy::create(index); +} + +PassRefPtr<IDBIndexBackendInterface> IDBObjectStoreProxy::index(const String& name, ExceptionCode& ec) +{ + WebKit::WebIDBIndex* index = m_webIDBObjectStore->index(name, ec); + if (!index) + return 0; + return IDBIndexBackendProxy::create(index); +} + +void IDBObjectStoreProxy::deleteIndex(const String& name, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBObjectStore->deleteIndex(name, *transactionProxy->getWebIDBTransaction(), ec); +} + +void IDBObjectStoreProxy::openCursor(PassRefPtr<IDBKeyRange> range, unsigned short direction, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec) +{ + // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer, + // all implementations of IDB interfaces are proxy objects. + IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction); + m_webIDBObjectStore->openCursor(range, direction, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/IDBObjectStoreProxy.h b/WebKit/chromium/src/IDBObjectStoreProxy.h new file mode 100755 index 0000000..348c794 --- /dev/null +++ b/WebKit/chromium/src/IDBObjectStoreProxy.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef IDBObjectStoreProxy_h +#define IDBObjectStoreProxy_h + +#include "IDBObjectStoreBackendInterface.h" +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> +#include <wtf/PassRefPtr.h> + +#if ENABLE(INDEXED_DATABASE) + +namespace WebKit { class WebIDBObjectStore; } + +namespace WebCore { + +class IDBObjectStoreProxy : public IDBObjectStoreBackendInterface { +public: + static PassRefPtr<IDBObjectStoreBackendInterface> create(PassOwnPtr<WebKit::WebIDBObjectStore>); + virtual ~IDBObjectStoreProxy(); + + virtual String name() const; + virtual String keyPath() const; + virtual PassRefPtr<DOMStringList> indexNames() const; + + virtual void get(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&); + virtual void put(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBKey>, bool addOnly, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&); + virtual void deleteFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&); + + PassRefPtr<IDBIndexBackendInterface> createIndex(const String& name, const String& keyPath, bool unique, IDBTransactionBackendInterface*, ExceptionCode&); + PassRefPtr<IDBIndexBackendInterface> index(const String& name, ExceptionCode&); + void deleteIndex(const String& name, IDBTransactionBackendInterface*, ExceptionCode&); + + virtual void openCursor(PassRefPtr<IDBKeyRange>, unsigned short direction, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&); + +private: + IDBObjectStoreProxy(PassOwnPtr<WebKit::WebIDBObjectStore>); + + OwnPtr<WebKit::WebIDBObjectStore> m_webIDBObjectStore; +}; + +} // namespace WebCore + +#endif + +#endif // IDBObjectStoreProxy_h + diff --git a/WebKit/chromium/src/IDBTransactionBackendProxy.cpp b/WebKit/chromium/src/IDBTransactionBackendProxy.cpp new file mode 100644 index 0000000..95c90d5 --- /dev/null +++ b/WebKit/chromium/src/IDBTransactionBackendProxy.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "IDBTransactionBackendProxy.h" + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBObjectStoreProxy.h" +#include "IDBTransactionCallbacks.h" +#include "WebIDBDatabaseError.h" +#include "WebIDBObjectStore.h" +#include "WebIDBTransaction.h" +#include "WebIDBTransactionCallbacksImpl.h" + +namespace WebCore { + +PassRefPtr<IDBTransactionBackendInterface> IDBTransactionBackendProxy::create(PassOwnPtr<WebKit::WebIDBTransaction> transaction) +{ + return adoptRef(new IDBTransactionBackendProxy(transaction)); +} + +IDBTransactionBackendProxy::IDBTransactionBackendProxy(PassOwnPtr<WebKit::WebIDBTransaction> transaction) + : m_webIDBTransaction(transaction) +{ + ASSERT(m_webIDBTransaction); +} + +IDBTransactionBackendProxy::~IDBTransactionBackendProxy() +{ +} + +PassRefPtr<IDBObjectStoreBackendInterface> IDBTransactionBackendProxy::objectStore(const String& name, ExceptionCode& ec) +{ + WebKit::WebIDBObjectStore* objectStore = m_webIDBTransaction->objectStore(name, ec); + if (!objectStore) + return 0; + return IDBObjectStoreProxy::create(objectStore); +} + +unsigned short IDBTransactionBackendProxy::mode() const +{ + return m_webIDBTransaction->mode(); +} + +void IDBTransactionBackendProxy::abort() +{ + m_webIDBTransaction->abort(); +} + +bool IDBTransactionBackendProxy::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>, PassOwnPtr<ScriptExecutionContext::Task>) +{ + // This should never be reached as it's the impl objects who get to + // execute tasks in the browser process. + ASSERT_NOT_REACHED(); + return false; +} + +void IDBTransactionBackendProxy::didCompleteTaskEvents() +{ + m_webIDBTransaction->didCompleteTaskEvents(); +} + +void IDBTransactionBackendProxy::setCallbacks(IDBTransactionCallbacks* callbacks) +{ + m_webIDBTransaction->setCallbacks(new WebIDBTransactionCallbacksImpl(callbacks)); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/IDBTransactionBackendProxy.h b/WebKit/chromium/src/IDBTransactionBackendProxy.h new file mode 100644 index 0000000..96d7293 --- /dev/null +++ b/WebKit/chromium/src/IDBTransactionBackendProxy.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef IDBTransactionBackendProxy_h +#define IDBTransactionBackendProxy_h + +#include "IDBTransactionBackendInterface.h" + +#if ENABLE(INDEXED_DATABASE) + +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> + +namespace WebKit { class WebIDBTransaction; } + +namespace WebCore { + +class IDBTransactionBackendProxy : public IDBTransactionBackendInterface { +public: + static PassRefPtr<IDBTransactionBackendInterface> create(PassOwnPtr<WebKit::WebIDBTransaction>); + virtual ~IDBTransactionBackendProxy(); + + virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name, ExceptionCode&); + virtual unsigned short mode() const; + virtual void abort(); + virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>, PassOwnPtr<ScriptExecutionContext::Task>); + virtual void didCompleteTaskEvents(); + virtual void setCallbacks(IDBTransactionCallbacks*); + + WebKit::WebIDBTransaction* getWebIDBTransaction() const { return m_webIDBTransaction.get(); } + +private: + IDBTransactionBackendProxy(PassOwnPtr<WebKit::WebIDBTransaction>); + + OwnPtr<WebKit::WebIDBTransaction> m_webIDBTransaction; +}; + +} // namespace WebCore + +#endif + +#endif // IDBTransactionBackendProxy_h diff --git a/WebKit/chromium/src/IDBTransactionCallbacksProxy.cpp b/WebKit/chromium/src/IDBTransactionCallbacksProxy.cpp new file mode 100644 index 0000000..3a19fe2 --- /dev/null +++ b/WebKit/chromium/src/IDBTransactionCallbacksProxy.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2010 Google 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "IDBTransactionCallbacksProxy.h" + +#include "WebIDBTransactionCallbacks.h" + +#if ENABLE(INDEXED_DATABASE) + +namespace WebCore { + +PassRefPtr<IDBTransactionCallbacksProxy> IDBTransactionCallbacksProxy::create(PassOwnPtr<WebKit::WebIDBTransactionCallbacks> callbacks) +{ + return adoptRef(new IDBTransactionCallbacksProxy(callbacks)); +} + +IDBTransactionCallbacksProxy::IDBTransactionCallbacksProxy(PassOwnPtr<WebKit::WebIDBTransactionCallbacks> callbacks) + : m_callbacks(callbacks) +{ +} + +IDBTransactionCallbacksProxy::~IDBTransactionCallbacksProxy() +{ +} + +void IDBTransactionCallbacksProxy::onAbort() +{ + m_callbacks->onAbort(); + m_callbacks.clear(); +} + +void IDBTransactionCallbacksProxy::onComplete() +{ + m_callbacks->onComplete(); + m_callbacks.clear(); +} + +void IDBTransactionCallbacksProxy::onTimeout() +{ + m_callbacks->onTimeout(); + m_callbacks.clear(); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/IDBTransactionCallbacksProxy.h b/WebKit/chromium/src/IDBTransactionCallbacksProxy.h new file mode 100644 index 0000000..891d5c9 --- /dev/null +++ b/WebKit/chromium/src/IDBTransactionCallbacksProxy.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2010 Google 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef IDBTransactionCallbacksProxy_h +#define IDBTransactionCallbacksProxy_h + +#include "IDBTransactionCallbacks.h" + +#if ENABLE(INDEXED_DATABASE) + +#include <wtf/PassOwnPtr.h> +#include <wtf/PassRefPtr.h> + +namespace WebKit { class WebIDBTransactionCallbacks; } + +namespace WebCore { + +class IDBTransactionCallbacksProxy : public IDBTransactionCallbacks { +public: + static PassRefPtr<IDBTransactionCallbacksProxy> create(PassOwnPtr<WebKit::WebIDBTransactionCallbacks>); + virtual ~IDBTransactionCallbacksProxy(); + + virtual void onAbort(); + virtual void onComplete(); + virtual void onTimeout(); + +private: + IDBTransactionCallbacksProxy(PassOwnPtr<WebKit::WebIDBTransactionCallbacks>); + + OwnPtr<WebKit::WebIDBTransactionCallbacks> m_callbacks; +}; + + +} // namespace WebCore + +#endif + +#endif // IDBTransactionCallbacksProxy_h diff --git a/WebKit/chromium/src/InspectorClientImpl.cpp b/WebKit/chromium/src/InspectorClientImpl.cpp index 54550d1..77150bb 100644 --- a/WebKit/chromium/src/InspectorClientImpl.cpp +++ b/WebKit/chromium/src/InspectorClientImpl.cpp @@ -33,10 +33,9 @@ #include "DOMWindow.h" #include "FloatRect.h" -#include "InspectorController.h" #include "NotImplemented.h" #include "Page.h" -#include "Settings.h" +#include "WebDevToolsAgentImpl.h" #include "WebRect.h" #include "WebURL.h" #include "WebURLRequest.h" @@ -60,159 +59,56 @@ InspectorClientImpl::~InspectorClientImpl() void InspectorClientImpl::inspectorDestroyed() { - // Our lifetime is bound to the WebViewImpl. + if (WebDevToolsAgentImpl* agent = devToolsAgent()) + agent->inspectorDestroyed(); } -Page* InspectorClientImpl::createPage() +void InspectorClientImpl::openInspectorFrontend(InspectorController* controller) { - // This method should never be called in Chrome as inspector front-end lives - // in a separate process. - ASSERT_NOT_REACHED(); - return 0; -} - -void InspectorClientImpl::showWindow() -{ - ASSERT(m_inspectedWebView->devToolsAgentPrivate()); - m_inspectedWebView->page()->inspectorController()->setWindowVisible(true); -} - -void InspectorClientImpl::closeWindow() -{ - if (m_inspectedWebView->page()) - m_inspectedWebView->page()->inspectorController()->setWindowVisible(false); -} - -bool InspectorClientImpl::windowVisible() -{ - ASSERT(m_inspectedWebView->devToolsAgentPrivate()); - return false; -} - -void InspectorClientImpl::attachWindow() -{ - // FIXME: Implement this -} - -void InspectorClientImpl::detachWindow() -{ - // FIXME: Implement this -} - -void InspectorClientImpl::setAttachedWindowHeight(unsigned int height) -{ - // FIXME: Implement this - notImplemented(); -} - -static void invalidateNodeBoundingRect(WebViewImpl* webView) -{ - // FIXME: Is it important to just invalidate the rect of the node region - // given that this is not on a critical codepath? In order to do so, we'd - // have to take scrolling into account. - const WebSize& size = webView->size(); - WebRect damagedRect(0, 0, size.width, size.height); - if (webView->client()) - webView->client()->didInvalidateRect(damagedRect); + if (WebDevToolsAgentImpl* agent = devToolsAgent()) + agent->openInspectorFrontend(controller); } void InspectorClientImpl::highlight(Node* node) { - // InspectorController does the actually tracking of the highlighted node - // and the drawing of the highlight. Here we just make sure to invalidate - // the rects of the old and new nodes. - hideHighlight(); + if (WebDevToolsAgentImpl* agent = devToolsAgent()) + agent->highlight(node); } void InspectorClientImpl::hideHighlight() { - // FIXME: able to invalidate a smaller rect. - invalidateNodeBoundingRect(m_inspectedWebView); -} - -void InspectorClientImpl::inspectedURLChanged(const String& newURL) -{ - // FIXME: Implement this -} - -String InspectorClientImpl::localizedStringsURL() -{ - notImplemented(); - return String(); -} - -String InspectorClientImpl::hiddenPanels() -{ - notImplemented(); - return ""; + if (WebDevToolsAgentImpl* agent = devToolsAgent()) + agent->hideHighlight(); } void InspectorClientImpl::populateSetting(const String& key, String* value) { - loadSettings(); - if (m_settings->contains(key)) - *value = m_settings->get(key); + if (WebDevToolsAgentImpl* agent = devToolsAgent()) + agent->populateSetting(key, value); } void InspectorClientImpl::storeSetting(const String& key, const String& value) { - loadSettings(); - m_settings->set(key, value); - saveSettings(); + if (WebDevToolsAgentImpl* agent = devToolsAgent()) + agent->storeSetting(key, value); } -void InspectorClientImpl::inspectorWindowObjectCleared() +bool InspectorClientImpl::sendMessageToFrontend(const WTF::String& message) { - notImplemented(); + if (WebDevToolsAgentImpl* agent = devToolsAgent()) + return agent->sendMessageToFrontend(message); + return false; } -void InspectorClientImpl::loadSettings() +void InspectorClientImpl::updateInspectorStateCookie(const WTF::String& inspectorState) { - if (m_settings) - return; - - m_settings.set(new SettingsMap); - String data = m_inspectedWebView->inspectorSettings(); - if (data.isEmpty()) - return; - - Vector<String> entries; - data.split("\n", entries); - for (Vector<String>::iterator it = entries.begin(); it != entries.end(); ++it) { - Vector<String> tokens; - it->split(":", tokens); - if (tokens.size() < 3) - continue; - - String name = decodeURLEscapeSequences(tokens[0]); - String type = tokens[1]; - String value = tokens[2]; - for (size_t i = 3; i < tokens.size(); ++i) - value += ":" + tokens[i]; - - if (type == "string") - value = decodeURLEscapeSequences(value); - - m_settings->set(name, value); - } + if (WebDevToolsAgentImpl* agent = devToolsAgent()) + agent->updateInspectorStateCookie(inspectorState); } -void InspectorClientImpl::saveSettings() +WebDevToolsAgentImpl* InspectorClientImpl::devToolsAgent() { - String data; - for (SettingsMap::iterator it = m_settings->begin(); it != m_settings->end(); ++it) { - String name = encodeWithURLEscapeSequences(it->first); - String value = it->second; - String entry = String::format( - "%s:string:%s", - name.utf8().data(), - encodeWithURLEscapeSequences(value).utf8().data()); - data.append(entry); - data.append("\n"); - } - m_inspectedWebView->setInspectorSettings(data); - if (m_inspectedWebView->client()) - m_inspectedWebView->client()->didUpdateInspectorSettings(); + return static_cast<WebDevToolsAgentImpl*>(m_inspectedWebView->devToolsAgent()); } } // namespace WebKit diff --git a/WebKit/chromium/src/InspectorClientImpl.h b/WebKit/chromium/src/InspectorClientImpl.h index 6f7f8b1..78d34e3 100644 --- a/WebKit/chromium/src/InspectorClientImpl.h +++ b/WebKit/chromium/src/InspectorClientImpl.h @@ -36,6 +36,9 @@ #include <wtf/OwnPtr.h> namespace WebKit { + +class WebDevToolsAgentClient; +class WebDevToolsAgentImpl; class WebViewImpl; class InspectorClientImpl : public WebCore::InspectorClient { @@ -45,35 +48,22 @@ public: // InspectorClient methods: virtual void inspectorDestroyed(); - virtual WebCore::Page* createPage(); - virtual WebCore::String localizedStringsURL(); - virtual WebCore::String hiddenPanels(); - virtual void showWindow(); - virtual void closeWindow(); - virtual bool windowVisible(); - virtual void attachWindow(); - virtual void detachWindow(); - virtual void setAttachedWindowHeight(unsigned height); + virtual void openInspectorFrontend(WebCore::InspectorController*); + virtual void highlight(WebCore::Node*); virtual void hideHighlight(); - virtual void inspectedURLChanged(const WebCore::String& newURL); - virtual void populateSetting( - const WebCore::String& key, - WebCore::String* value); - virtual void storeSetting( - const WebCore::String& key, - const WebCore::String& value); - virtual void inspectorWindowObjectCleared(); + virtual void populateSetting(const WTF::String& key, WTF::String* value); + virtual void storeSetting(const WTF::String& key, const WTF::String& value); + + virtual bool sendMessageToFrontend(const WTF::String&); + + virtual void updateInspectorStateCookie(const WTF::String&); private: - void loadSettings(); - void saveSettings(); + WebDevToolsAgentImpl* devToolsAgent(); // The WebViewImpl of the page being inspected; gets passed to the constructor WebViewImpl* m_inspectedWebView; - - typedef HashMap<WebCore::String, WebCore::String> SettingsMap; - OwnPtr<SettingsMap> m_settings; }; } // namespace WebKit diff --git a/WebKit/chromium/src/InspectorFrontendClientImpl.cpp b/WebKit/chromium/src/InspectorFrontendClientImpl.cpp new file mode 100644 index 0000000..51864f1 --- /dev/null +++ b/WebKit/chromium/src/InspectorFrontendClientImpl.cpp @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "InspectorFrontendClientImpl.h" + +#include "Document.h" +#include "Frame.h" +#include "InspectorFrontendHost.h" +#include "Page.h" +#include "PlatformString.h" +#include "V8InspectorFrontendHost.h" +#include "V8Proxy.h" +#include "WebDevToolsFrontendClient.h" +#include "WebDevToolsFrontendImpl.h" +#include "WebString.h" + +using namespace WebCore; + +namespace WebKit { + +InspectorFrontendClientImpl::InspectorFrontendClientImpl(Page* frontendPage, WebDevToolsFrontendClient* client, WebDevToolsFrontendImpl* frontend) + : m_frontendPage(frontendPage) + , m_client(client) + , m_frontend(frontend) +{ +} + +InspectorFrontendClientImpl::~InspectorFrontendClientImpl() +{ + if (m_frontendHost) + m_frontendHost->disconnectClient(); + m_client = 0; +} + +void InspectorFrontendClientImpl::windowObjectCleared() +{ + v8::HandleScope handleScope; + v8::Handle<v8::Context> frameContext = V8Proxy::context(m_frontendPage->mainFrame()); + v8::Context::Scope contextScope(frameContext); + + ASSERT(!m_frontendHost); + m_frontendHost = InspectorFrontendHost::create(this, m_frontendPage); + v8::Handle<v8::Value> frontendHostObj = toV8(m_frontendHost.get()); + v8::Handle<v8::Object> global = frameContext->Global(); + + global->Set(v8::String::New("InspectorFrontendHost"), frontendHostObj); +} + +void InspectorFrontendClientImpl::frontendLoaded() +{ + m_frontend->frontendLoaded(); +} + +void InspectorFrontendClientImpl::moveWindowBy(float x, float y) +{ +} + +String InspectorFrontendClientImpl::localizedStringsURL() +{ + return ""; +} + +String InspectorFrontendClientImpl::hiddenPanels() +{ + if (m_client->shouldHideScriptsPanel()) + return "scripts"; + return ""; +} + +void InspectorFrontendClientImpl::bringToFront() +{ + m_client->activateWindow(); +} + +void InspectorFrontendClientImpl::closeWindow() +{ + m_client->closeWindow(); +} + +void InspectorFrontendClientImpl::disconnectFromBackend() +{ + m_client->closeWindow(); +} + +void InspectorFrontendClientImpl::requestAttachWindow() +{ + m_client->requestDockWindow(); +} + +void InspectorFrontendClientImpl::requestDetachWindow() +{ + m_client->requestUndockWindow(); +} + +void InspectorFrontendClientImpl::changeAttachedWindowHeight(unsigned) +{ + // Do nothing; +} + +void InspectorFrontendClientImpl::inspectedURLChanged(const String& url) +{ + m_frontendPage->mainFrame()->document()->setTitle("Developer Tools - " + url); +} + +void InspectorFrontendClientImpl::sendMessageToBackend(const String& message) +{ + m_client->sendMessageToBackend(message); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/InspectorFrontendClientImpl.h b/WebKit/chromium/src/InspectorFrontendClientImpl.h new file mode 100644 index 0000000..fc21f3e --- /dev/null +++ b/WebKit/chromium/src/InspectorFrontendClientImpl.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef InspectorFrontendClientImpl_h +#define InspectorFrontendClientImpl_h + +#include "InspectorFrontendClient.h" +#include <wtf/Noncopyable.h> + +namespace WebCore { +class InspectorFrontendHost; +class Page; +} + +namespace WebKit { + +class WebDevToolsFrontendClient; +class WebDevToolsFrontendImpl; + +class InspectorFrontendClientImpl : public WebCore::InspectorFrontendClient + , public Noncopyable { +public: + InspectorFrontendClientImpl(WebCore::Page*, WebDevToolsFrontendClient*, WebDevToolsFrontendImpl*); + virtual ~InspectorFrontendClientImpl(); + + // InspectorFrontendClient methods: + virtual void windowObjectCleared(); + virtual void frontendLoaded(); + + virtual void moveWindowBy(float x, float y); + + virtual WTF::String localizedStringsURL(); + virtual WTF::String hiddenPanels(); + + virtual void bringToFront(); + virtual void closeWindow(); + virtual void disconnectFromBackend(); + + virtual void requestAttachWindow(); + virtual void requestDetachWindow(); + virtual void changeAttachedWindowHeight(unsigned); + + virtual void inspectedURLChanged(const WTF::String&); + + virtual void sendMessageToBackend(const WTF::String&); +private: + WebCore::Page* m_frontendPage; + WebDevToolsFrontendClient* m_client; + WebDevToolsFrontendImpl* m_frontend; + RefPtr<WebCore::InspectorFrontendHost> m_frontendHost; +}; + +} // namespace WebKit + +#endif diff --git a/WebKit/chromium/src/LocalFileSystemChromium.cpp b/WebKit/chromium/src/LocalFileSystemChromium.cpp new file mode 100644 index 0000000..a9c61d0 --- /dev/null +++ b/WebKit/chromium/src/LocalFileSystemChromium.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "LocalFileSystem.h" + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileSystem.h" +#include "ErrorCallback.h" +#include "FileSystemCallback.h" +#include "FileSystemCallbacks.h" +#include "PlatformString.h" +#include "WebFileSystem.h" +#include "WebFileSystemCallbacksImpl.h" +#include "WebFrameClient.h" +#include "WebFrameImpl.h" +#include "WebWorkerImpl.h" +#include "WorkerContext.h" +#include "WorkerThread.h" +#include <wtf/Threading.h> + +using namespace WebKit; + +namespace WebCore { + +LocalFileSystem& LocalFileSystem::localFileSystem() +{ + AtomicallyInitializedStatic(LocalFileSystem*, localFileSystem = new LocalFileSystem("")); + return *localFileSystem; +} + +void LocalFileSystem::readFileSystem(ScriptExecutionContext* context, AsyncFileSystem::Type type, long long size, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + ASSERT(context && context->isDocument()); + Document* document = static_cast<Document*>(context); + WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame()); + webFrame->client()->openFileSystem(webFrame, static_cast<WebFileSystem::Type>(type), size, false, new WebFileSystemCallbacksImpl(callbacks)); +} + +void LocalFileSystem::requestFileSystem(ScriptExecutionContext* context, AsyncFileSystem::Type type, long long size, PassOwnPtr<AsyncFileSystemCallbacks> callbacks, bool synchronous) +{ + ASSERT(context); + if (context->isDocument()) { + Document* document = static_cast<Document*>(context); + WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame()); + webFrame->client()->openFileSystem(webFrame, static_cast<WebFileSystem::Type>(type), size, true, new WebFileSystemCallbacksImpl(callbacks)); + } else { + WorkerContext* workerContext = static_cast<WorkerContext*>(context); + WorkerLoaderProxy* workerLoaderProxy = &workerContext->thread()->workerLoaderProxy(); + WebWorkerBase* webWorker = static_cast<WebWorkerBase*>(workerLoaderProxy); + webWorker->openFileSystem(static_cast<WebFileSystem::Type>(type), size, new WebFileSystemCallbacksImpl(callbacks, context, synchronous), synchronous); + } +} + +} // namespace WebCore + +#endif // ENABLE(FILE_SYSTEM) diff --git a/WebKit/chromium/src/LocalizedStrings.cpp b/WebKit/chromium/src/LocalizedStrings.cpp index 4e01848..e7b39d5 100644 --- a/WebKit/chromium/src/LocalizedStrings.cpp +++ b/WebKit/chromium/src/LocalizedStrings.cpp @@ -33,14 +33,15 @@ #include "IntSize.h" #include "NotImplemented.h" -#include "PlatformString.h" -#include "StringBuilder.h" #include "WebKit.h" #include "WebKitClient.h" #include "WebLocalizedString.h" #include "WebString.h" +#include <wtf/text/StringBuilder.h> +#include <wtf/text/WTFString.h> + using WebKit::WebLocalizedString; namespace WebCore { @@ -93,6 +94,7 @@ String searchMenuRecentSearchesText() { return query(WebLocalizedString::SearchMenuRecentSearchesText); } + String searchMenuClearRecentSearchesText() { return query(WebLocalizedString::SearchMenuClearRecentSearchesText); @@ -174,6 +176,18 @@ String AXMenuListActionVerb() { return String(); } + +String missingPluginText() +{ + notImplemented(); + return String("Missing Plug-in"); +} + +String crashedPluginText() +{ + notImplemented(); + return String("Plug-in Failure"); +} String multipleFileUploadText(unsigned numberOfFiles) { @@ -201,14 +215,13 @@ String keygenMenuMediumGradeKeySize() // Used in ImageDocument.cpp as the title for pages when that page is an image. String imageTitle(const String& filename, const IntSize& size) { - // Note that we cannot use String::format because it works for ASCII only. StringBuilder result; result.append(filename); result.append(" ("); result.append(String::number(size.width())); result.append(static_cast<UChar>(0xD7)); // U+00D7 (multiplication sign) result.append(String::number(size.height())); - result.append(")"); + result.append(')'); return result.toString(); } @@ -253,6 +266,16 @@ String contextMenuItemTagInspectElement() { return String(); } String contextMenuItemTagShowSpellingPanel(bool show) { return String(); } String mediaElementLiveBroadcastStateText() { return String(); } String mediaElementLoadingStateText() { return String(); } +String contextMenuItemTagOpenVideoInNewWindow() { return String(); } +String contextMenuItemTagOpenAudioInNewWindow() { return String(); } +String contextMenuItemTagCopyVideoLinkToClipboard() { return String(); } +String contextMenuItemTagCopyAudioLinkToClipboard() { return String(); } +String contextMenuItemTagToggleMediaControls() { return String(); } +String contextMenuItemTagToggleMediaLoop() { return String(); } +String contextMenuItemTagEnterVideoFullscreen() { return String(); } +String contextMenuItemTagMediaPlay() { return String(); } +String contextMenuItemTagMediaPause() { return String(); } +String contextMenuItemTagMediaMute() { return String(); } String localizedMediaControlElementString(const String& /*name*/) { @@ -274,44 +297,81 @@ String localizedMediaTimeDescription(float /*time*/) String validationMessageValueMissingText() { - notImplemented(); - return String(); + return query(WebLocalizedString::ValidationValueMissing); +} + +String validationMessageValueMissingForCheckboxText() +{ + return query(WebLocalizedString::ValidationValueMissingForCheckbox); +} + +String validationMessageValueMissingForFileText() +{ + return query(WebLocalizedString::ValidationValueMissingForFile); +} + +String validationMessageValueMissingForMultipleFileText() +{ + return query(WebLocalizedString::ValidationValueMissingForMultipleFile); +} + +String validationMessageValueMissingForRadioText() +{ + return query(WebLocalizedString::ValidationValueMissingForRadio); +} + +String validationMessageValueMissingForSelectText() +{ + return query(WebLocalizedString::ValidationValueMissingForSelect); } String validationMessageTypeMismatchText() { - notImplemented(); - return String(); + return query(WebLocalizedString::ValidationTypeMismatch); +} + +String validationMessageTypeMismatchForEmailText() +{ + return query(WebLocalizedString::ValidationTypeMismatchForEmail); +} + +String validationMessageTypeMismatchForMultipleEmailText() +{ + return query(WebLocalizedString::ValidationTypeMismatchForMultipleEmail); +} + +String validationMessageTypeMismatchForURLText() +{ + return query(WebLocalizedString::ValidationTypeMismatchForURL); } String validationMessagePatternMismatchText() { - notImplemented(); - return String(); + return query(WebLocalizedString::ValidationPatternMismatch); } -String validationMessageTooLongText() +String validationMessageTooLongText(int, int) { - notImplemented(); - return String(); + // FIXME: pass the arguments. + return query(WebLocalizedString::ValidationTooLong); } -String validationMessageRangeUnderflowText() +String validationMessageRangeUnderflowText(const String&) { - notImplemented(); - return String(); + // FIXME: pass the arguments. + return query(WebLocalizedString::ValidationRangeUnderflow); } -String validationMessageRangeOverflowText() +String validationMessageRangeOverflowText(const String&) { - notImplemented(); - return String(); + // FIXME: pass the arguments. + return query(WebLocalizedString::ValidationRangeOverflow); } -String validationMessageStepMismatchText() +String validationMessageStepMismatchText(const String&, const String&) { - notImplemented(); - return String(); + // FIXME: pass the arguments. + return query(WebLocalizedString::ValidationStepMismatch); } } // namespace WebCore diff --git a/WebKit/chromium/src/NotificationPresenterImpl.cpp b/WebKit/chromium/src/NotificationPresenterImpl.cpp index a38b8b5..1931465 100644 --- a/WebKit/chromium/src/NotificationPresenterImpl.cpp +++ b/WebKit/chromium/src/NotificationPresenterImpl.cpp @@ -33,11 +33,11 @@ #if ENABLE(NOTIFICATIONS) -#include "Document.h" +#include "KURL.h" #include "Notification.h" +#include "ScriptExecutionContext.h" #include "SecurityOrigin.h" -#include "WebDocument.h" #include "WebNotification.h" #include "WebNotificationPermissionCallback.h" #include "WebNotificationPresenter.h" @@ -92,19 +92,15 @@ void NotificationPresenterImpl::notificationObjectDestroyed(Notification* notifi m_presenter->objectDestroyed(PassRefPtr<Notification>(notification)); } -NotificationPresenter::Permission NotificationPresenterImpl::checkPermission(const KURL& url, Document* document) +NotificationPresenter::Permission NotificationPresenterImpl::checkPermission(ScriptExecutionContext* context) { - WebDocument webDocument; - if (document) - webDocument = document; - - int result = m_presenter->checkPermission(url, document ? &webDocument : 0); + int result = m_presenter->checkPermission(context->url()); return static_cast<NotificationPresenter::Permission>(result); } -void NotificationPresenterImpl::requestPermission(SecurityOrigin* origin, PassRefPtr<VoidCallback> callback) +void NotificationPresenterImpl::requestPermission(ScriptExecutionContext* context, PassRefPtr<VoidCallback> callback) { - m_presenter->requestPermission(origin->toString(), new VoidCallbackClient(callback)); + m_presenter->requestPermission(WebSecurityOrigin(context->securityOrigin()), new VoidCallbackClient(callback)); } } // namespace WebKit diff --git a/WebKit/chromium/src/NotificationPresenterImpl.h b/WebKit/chromium/src/NotificationPresenterImpl.h index 8e3799c..bb156dd 100644 --- a/WebKit/chromium/src/NotificationPresenterImpl.h +++ b/WebKit/chromium/src/NotificationPresenterImpl.h @@ -54,8 +54,9 @@ public: virtual bool show(WebCore::Notification* object); virtual void cancel(WebCore::Notification* object); virtual void notificationObjectDestroyed(WebCore::Notification* object); - virtual WebCore::NotificationPresenter::Permission checkPermission(const WebCore::KURL& url, WebCore::Document* document); - virtual void requestPermission(WebCore::SecurityOrigin* origin, WTF::PassRefPtr<WebCore::VoidCallback> callback); + virtual WebCore::NotificationPresenter::Permission checkPermission(WebCore::ScriptExecutionContext*); + virtual void requestPermission(WebCore::ScriptExecutionContext* , WTF::PassRefPtr<WebCore::VoidCallback> callback); + virtual void cancelRequestsForPermission(WebCore::ScriptExecutionContext*) {} private: // WebNotificationPresenter that this object delegates to. diff --git a/WebKit/chromium/src/PlatformMessagePortChannel.h b/WebKit/chromium/src/PlatformMessagePortChannel.h index 05e8397..5416145 100644 --- a/WebKit/chromium/src/PlatformMessagePortChannel.h +++ b/WebKit/chromium/src/PlatformMessagePortChannel.h @@ -31,12 +31,9 @@ #ifndef PlatformMessagePortChannel_h #define PlatformMessagePortChannel_h -// FIXME: This relative path is a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebMessagePortChannelClient.h" +#include "WebMessagePortChannelClient.h" #include "MessagePortChannel.h" - #include <wtf/PassRefPtr.h> #include <wtf/Threading.h> diff --git a/WebKit/chromium/src/ResourceHandle.cpp b/WebKit/chromium/src/ResourceHandle.cpp index bf6910f..83e0017 100644 --- a/WebKit/chromium/src/ResourceHandle.cpp +++ b/WebKit/chromium/src/ResourceHandle.cpp @@ -31,8 +31,10 @@ #include "config.h" #include "ResourceHandle.h" +#include "ChromiumBridge.h" #include "ResourceHandleClient.h" #include "ResourceRequest.h" +#include "SharedBuffer.h" #include "WebKit.h" #include "WebKitClient.h" @@ -56,6 +58,7 @@ public: : m_request(request) , m_owner(0) , m_client(client) + , m_state(ConnectionStateNew) { } @@ -70,17 +73,36 @@ public: WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); virtual void didReceiveResponse(WebURLLoader*, const WebURLResponse&); virtual void didReceiveData(WebURLLoader*, const char* data, int dataLength); - virtual void didFinishLoading(WebURLLoader*); + virtual void didReceiveCachedMetadata(WebURLLoader*, const char* data, int dataLength); + virtual void didFinishLoading(WebURLLoader*, double finishTime); virtual void didFail(WebURLLoader*, const WebURLError&); + enum ConnectionState { + ConnectionStateNew, + ConnectionStateStarted, + ConnectionStateReceivedResponse, + ConnectionStateReceivingData, + ConnectionStateFinishedLoading, + ConnectionStateCanceled, + ConnectionStateFailed, + }; + ResourceRequest m_request; ResourceHandle* m_owner; ResourceHandleClient* m_client; OwnPtr<WebURLLoader> m_loader; + + // Used for sanity checking to make sure we don't experience illegal state + // transitions. + ConnectionState m_state; }; void ResourceHandleInternal::start() { + if (m_state != ConnectionStateNew) + CRASH(); + m_state = ConnectionStateStarted; + m_loader.set(webKitClient()->createURLLoader()); ASSERT(m_loader.get()); @@ -91,6 +113,7 @@ void ResourceHandleInternal::start() void ResourceHandleInternal::cancel() { + m_state = ConnectionStateCanceled; m_loader->cancel(); // Do not make any further calls to the client. @@ -127,6 +150,12 @@ void ResourceHandleInternal::didReceiveResponse(WebURLLoader*, const WebURLRespo { ASSERT(m_client); ASSERT(!response.isNull()); + bool isMultipart = response.isMultipartPayload(); + bool isValidStateTransition = (m_state == ConnectionStateStarted || m_state == ConnectionStateReceivedResponse); + // In the case of multipart loads, calls to didReceiveData & didReceiveResponse can be interleaved. + if (!isMultipart && !isValidStateTransition) + CRASH(); + m_state = ConnectionStateReceivedResponse; m_client->didReceiveResponse(m_owner, response.toResourceResponse()); } @@ -134,6 +163,9 @@ void ResourceHandleInternal::didReceiveData( WebURLLoader*, const char* data, int dataLength) { ASSERT(m_client); + if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData) + CRASH(); + m_state = ConnectionStateReceivingData; // FIXME(yurys): it looks like lengthReceived is always the same as // dataLength and that the latter parameter can be eliminated. @@ -141,15 +173,28 @@ void ResourceHandleInternal::didReceiveData( m_client->didReceiveData(m_owner, data, dataLength, dataLength); } -void ResourceHandleInternal::didFinishLoading(WebURLLoader*) +void ResourceHandleInternal::didReceiveCachedMetadata(WebURLLoader*, const char* data, int dataLength) +{ + ASSERT(m_client); + if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData) + CRASH(); + + m_client->didReceiveCachedMetadata(m_owner, data, dataLength); +} + +void ResourceHandleInternal::didFinishLoading(WebURLLoader*, double finishTime) { ASSERT(m_client); - m_client->didFinishLoading(m_owner); + if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData) + CRASH(); + m_state = ConnectionStateFinishedLoading; + m_client->didFinishLoading(m_owner, finishTime); } void ResourceHandleInternal::didFail(WebURLLoader*, const WebURLError& error) { ASSERT(m_client); + m_state = ConnectionStateFailed; m_client->didFail(m_owner, error); } @@ -158,8 +203,7 @@ void ResourceHandleInternal::didFail(WebURLLoader*, const WebURLError& error) ResourceHandle::ResourceHandle(const ResourceRequest& request, ResourceHandleClient* client, bool defersLoading, - bool shouldContentSniff, - bool mightDownloadFromHandle) + bool shouldContentSniff) : d(new ResourceHandleInternal(request, client)) { d->m_owner = this; @@ -167,23 +211,22 @@ ResourceHandle::ResourceHandle(const ResourceRequest& request, // FIXME: Figure out what to do with the bool params. } -PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request, +PassRefPtr<ResourceHandle> ResourceHandle::create(NetworkingContext* context, + const ResourceRequest& request, ResourceHandleClient* client, - Frame* deprecated, bool defersLoading, - bool shouldContentSniff, - bool mightDownloadFromHandle) + bool shouldContentSniff) { RefPtr<ResourceHandle> newHandle = adoptRef(new ResourceHandle( - request, client, defersLoading, shouldContentSniff, mightDownloadFromHandle)); + request, client, defersLoading, shouldContentSniff)); - if (newHandle->start(deprecated)) + if (newHandle->start(context)) return newHandle.release(); return 0; } -const ResourceRequest& ResourceHandle::request() const +ResourceRequest& ResourceHandle::firstRequest() { return d->m_request; } @@ -203,12 +246,17 @@ void ResourceHandle::setDefersLoading(bool value) d->setDefersLoading(value); } -bool ResourceHandle::start(Frame* deprecated) +bool ResourceHandle::start(NetworkingContext* context) { d->start(); return true; } +bool ResourceHandle::hasAuthenticationChallenge() const +{ + return false; +} + void ResourceHandle::clearAuthentication() { } @@ -240,12 +288,12 @@ bool ResourceHandle::supportsBufferedData() } // static -void ResourceHandle::loadResourceSynchronously(const ResourceRequest& request, +void ResourceHandle::loadResourceSynchronously(NetworkingContext* context, + const ResourceRequest& request, StoredCredentials storedCredentials, ResourceError& error, ResourceResponse& response, - Vector<char>& data, - Frame* deprecated) + Vector<char>& data) { OwnPtr<WebURLLoader> loader(webKitClient()->createURLLoader()); ASSERT(loader.get()); @@ -279,4 +327,10 @@ bool ResourceHandle::willLoadFromCache(ResourceRequest& request, Frame*) return true; } +// static +void ResourceHandle::cacheMetadata(const ResourceResponse& response, const Vector<char>& data) +{ + ChromiumBridge::cacheMetadata(response.url(), response.responseTime(), data); +} + } // namespace WebCore diff --git a/WebKit/chromium/src/SharedWorkerRepository.cpp b/WebKit/chromium/src/SharedWorkerRepository.cpp index c803aac..88d3ec5 100644 --- a/WebKit/chromium/src/SharedWorkerRepository.cpp +++ b/WebKit/chromium/src/SharedWorkerRepository.cpp @@ -36,6 +36,7 @@ #include "Event.h" #include "EventNames.h" +#include "InspectorController.h" #include "MessagePortChannel.h" #include "PlatformMessagePortChannel.h" #include "ScriptExecutionContext.h" @@ -69,7 +70,9 @@ public: , m_name(name) , m_webWorker(webWorker) , m_port(port) + , m_scriptLoader(ResourceRequestBase::TargetIsSharedWorker) , m_loading(false) + , m_responseAppCacheID(0) { } @@ -79,6 +82,7 @@ public: private: // WorkerScriptLoaderClient callback + virtual void didReceiveResponse(const ResourceResponse&); virtual void notifyFinished(); virtual void connected(); @@ -94,6 +98,7 @@ private: OwnPtr<MessagePortChannel> m_port; WorkerScriptLoader m_scriptLoader; bool m_loading; + long long m_responseAppCacheID; }; static Vector<SharedWorkerScriptLoader*>& pendingLoaders() @@ -146,14 +151,23 @@ static WebMessagePortChannel* getWebPort(PassOwnPtr<MessagePortChannel> port) return webPort; } +void SharedWorkerScriptLoader::didReceiveResponse(const ResourceResponse& response) +{ + m_responseAppCacheID = response.appCacheID(); +} + void SharedWorkerScriptLoader::notifyFinished() { if (m_scriptLoader.failed()) { m_worker->dispatchEvent(Event::create(eventNames().errorEvent, false, true)); delete this; } else { +#if ENABLE(INSPECTOR) + if (InspectorController* inspector = m_worker->scriptExecutionContext()->inspectorController()) + inspector->scriptImported(m_scriptLoader.identifier(), m_scriptLoader.script()); +#endif // Pass the script off to the worker, then send a connect event. - m_webWorker->startWorkerContext(m_url, m_name, m_worker->scriptExecutionContext()->userAgent(m_url), m_scriptLoader.script()); + m_webWorker->startWorkerContext(m_url, m_name, m_worker->scriptExecutionContext()->userAgent(m_url), m_scriptLoader.script(), m_responseAppCacheID); sendConnect(); } } @@ -206,7 +220,7 @@ void SharedWorkerRepository::connect(PassRefPtr<SharedWorker> worker, PassOwnPtr // The loader object manages its own lifecycle (and the lifecycles of the two worker objects). // It will free itself once loading is completed. - SharedWorkerScriptLoader* loader = new SharedWorkerScriptLoader(worker, url, name, port.release(), webWorker.release()); + SharedWorkerScriptLoader* loader = new SharedWorkerScriptLoader(worker, url, name, port, webWorker.release()); loader->load(); } diff --git a/WebKit/chromium/src/SpeechInputClientImpl.cpp b/WebKit/chromium/src/SpeechInputClientImpl.cpp new file mode 100644 index 0000000..b5ed384 --- /dev/null +++ b/WebKit/chromium/src/SpeechInputClientImpl.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "SpeechInputClientImpl.h" + +#include "PlatformString.h" +#include "SpeechInputListener.h" +#include "WebSpeechInputController.h" +#include "WebString.h" +#include "WebViewClient.h" +#include <wtf/PassOwnPtr.h> + +#if ENABLE(INPUT_SPEECH) + +namespace WebKit { + +PassOwnPtr<SpeechInputClientImpl> SpeechInputClientImpl::create(WebViewClient* client) +{ + return adoptPtr(new SpeechInputClientImpl(client)); +} + +SpeechInputClientImpl::SpeechInputClientImpl(WebViewClient* web_view_client) + : m_controller(web_view_client ? web_view_client->speechInputController(this) : 0) + , m_listener(0) +{ +} + +SpeechInputClientImpl::~SpeechInputClientImpl() +{ +} + +void SpeechInputClientImpl::setListener(WebCore::SpeechInputListener* listener) +{ + m_listener = listener; +} + +bool SpeechInputClientImpl::startRecognition(int requestId, const WebCore::IntRect& elementRect, const AtomicString& language, const String& grammar) +{ + ASSERT(m_listener); + return m_controller->startRecognition(requestId, elementRect, language, grammar); +} + +void SpeechInputClientImpl::stopRecording(int requestId) +{ + ASSERT(m_listener); + m_controller->stopRecording(requestId); +} + +void SpeechInputClientImpl::cancelRecognition(int requestId) +{ + ASSERT(m_listener); + m_controller->cancelRecognition(requestId); +} + +void SpeechInputClientImpl::didCompleteRecording(int requestId) +{ + ASSERT(m_listener); + m_listener->didCompleteRecording(requestId); +} + +void SpeechInputClientImpl::didCompleteRecognition(int requestId) +{ + ASSERT(m_listener); + m_listener->didCompleteRecognition(requestId); +} + +void SpeechInputClientImpl::setRecognitionResult(int requestId, const WebSpeechInputResultArray& results) +{ + ASSERT(m_listener); + WebCore::SpeechInputResultArray webcoreResults(results.size()); + for (size_t i = 0; i < results.size(); ++i) + webcoreResults[i] = results[i]; + m_listener->setRecognitionResult(requestId, webcoreResults); +} + +} // namespace WebKit + +#endif // ENABLE(INPUT_SPEECH) diff --git a/WebKit/chromium/src/SpeechInputClientImpl.h b/WebKit/chromium/src/SpeechInputClientImpl.h new file mode 100644 index 0000000..520803a --- /dev/null +++ b/WebKit/chromium/src/SpeechInputClientImpl.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2010 Google 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: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef SpeechInputClientImpl_h +#define SpeechInputClientImpl_h + +#if ENABLE(INPUT_SPEECH) + +#include "SpeechInputClient.h" +#include "WebSpeechInputListener.h" +#include <wtf/Forward.h> +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> + +namespace WebCore { +class SpeechInputListener; +} + +namespace WebKit { + +class WebSpeechInputController; +class WebViewClient; + +class SpeechInputClientImpl + : public WebCore::SpeechInputClient, + public WebSpeechInputListener { +public: + static PassOwnPtr<SpeechInputClientImpl> create(WebViewClient*); + virtual ~SpeechInputClientImpl(); + + // SpeechInputClient methods. + void setListener(WebCore::SpeechInputListener*); + bool startRecognition(int requestId, const WebCore::IntRect& elementRect, const AtomicString& language, const String& grammar); + void stopRecording(int); + void cancelRecognition(int); + + // WebSpeechInputListener methods. + void didCompleteRecording(int); + void setRecognitionResult(int, const WebSpeechInputResultArray&); + void didCompleteRecognition(int); + +private: + SpeechInputClientImpl(WebViewClient*); + + WebSpeechInputController* m_controller; // To call into the embedder. + WebCore::SpeechInputListener* m_listener; +}; + +} // namespace WebKit + +#endif // ENABLE(INPUT_SPEECH) + +#endif // SpeechInputClientImpl_h diff --git a/WebKit/chromium/src/StorageAreaProxy.cpp b/WebKit/chromium/src/StorageAreaProxy.cpp index c9185fe..5311b65 100644 --- a/WebKit/chromium/src/StorageAreaProxy.cpp +++ b/WebKit/chromium/src/StorageAreaProxy.cpp @@ -40,6 +40,7 @@ #include "StorageAreaImpl.h" #include "StorageEvent.h" +#include "WebFrameImpl.h" #include "WebStorageArea.h" #include "WebString.h" #include "WebURL.h" @@ -73,12 +74,13 @@ String StorageAreaProxy::getItem(const String& key) const String StorageAreaProxy::setItem(const String& key, const String& value, ExceptionCode& ec, Frame* frame) { - bool quotaException = false; + WebKit::WebStorageArea::Result result = WebKit::WebStorageArea::ResultOK; WebKit::WebString oldValue; - m_storageArea->setItem(key, value, frame->document()->url(), quotaException, oldValue); - ec = quotaException ? QUOTA_EXCEEDED_ERR : 0; + WebKit::WebFrame* webFrame = WebKit::WebFrameImpl::fromFrame(frame); + m_storageArea->setItem(key, value, frame->document()->url(), result, oldValue, webFrame); + ec = (result == WebKit::WebStorageArea::ResultOK) ? 0 : QUOTA_EXCEEDED_ERR; String oldValueString = oldValue; - if (oldValueString != value) + if (oldValueString != value && result == WebKit::WebStorageArea::ResultOK) storageEvent(key, oldValue, value, m_storageType, frame->document()->securityOrigin(), frame); return oldValue; } @@ -123,8 +125,12 @@ void StorageAreaProxy::storageEvent(const String& key, const String& oldValue, c frames.append(frame); } - for (unsigned i = 0; i < frames.size(); ++i) - frames[i]->document()->enqueueStorageEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->url(), frames[i]->domWindow()->sessionStorage())); + for (unsigned i = 0; i < frames.size(); ++i) { + ExceptionCode ec = 0; + Storage* storage = frames[i]->domWindow()->sessionStorage(ec); + if (!ec) + frames[i]->document()->enqueueEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->url(), storage)); + } } else { // Send events to every page. const HashSet<Page*>& pages = page->group().pages(); @@ -136,8 +142,12 @@ void StorageAreaProxy::storageEvent(const String& key, const String& oldValue, c } } - for (unsigned i = 0; i < frames.size(); ++i) - frames[i]->document()->enqueueStorageEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->url(), frames[i]->domWindow()->localStorage())); + for (unsigned i = 0; i < frames.size(); ++i) { + ExceptionCode ec = 0; + Storage* storage = frames[i]->domWindow()->localStorage(ec); + if (!ec) + frames[i]->document()->enqueueEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->url(), storage)); + } } } diff --git a/WebKit/chromium/src/StorageEventDispatcherImpl.cpp b/WebKit/chromium/src/StorageEventDispatcherImpl.cpp index 3518796..631753b 100644 --- a/WebKit/chromium/src/StorageEventDispatcherImpl.cpp +++ b/WebKit/chromium/src/StorageEventDispatcherImpl.cpp @@ -71,10 +71,11 @@ void StorageEventDispatcherImpl::dispatchStorageEvent(const String& key, const S } } - // FIXME: Figure out how to pass in the document URI. for (unsigned i = 0; i < frames.size(); ++i) { - frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, - url, frames[i]->domWindow()->localStorage())); + ExceptionCode ec = 0; + Storage* storage = frames[i]->domWindow()->localStorage(ec); + if (!ec) + frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, url, storage)); } } diff --git a/WebKit/chromium/src/StorageNamespaceProxy.cpp b/WebKit/chromium/src/StorageNamespaceProxy.cpp index 1be1967..ec0dbce 100644 --- a/WebKit/chromium/src/StorageNamespaceProxy.cpp +++ b/WebKit/chromium/src/StorageNamespaceProxy.cpp @@ -47,11 +47,11 @@ PassRefPtr<StorageNamespace> StorageNamespace::localStorageNamespace(const Strin return adoptRef(new StorageNamespaceProxy(WebKit::webKitClient()->createLocalStorageNamespace(path, quota), LocalStorage)); } -PassRefPtr<StorageNamespace> StorageNamespace::sessionStorageNamespace(Page* page) +PassRefPtr<StorageNamespace> StorageNamespace::sessionStorageNamespace(Page* page, unsigned quota) { WebKit::ChromeClientImpl* chromeClientImpl = static_cast<WebKit::ChromeClientImpl*>(page->chrome()->client()); WebKit::WebViewClient* webViewClient = chromeClientImpl->webView()->client(); - return adoptRef(new StorageNamespaceProxy(webViewClient->createSessionStorageNamespace(), SessionStorage)); + return adoptRef(new StorageNamespaceProxy(webViewClient->createSessionStorageNamespace(quota), SessionStorage)); } StorageNamespaceProxy::StorageNamespaceProxy(WebKit::WebStorageNamespace* storageNamespace, StorageType storageType) @@ -67,13 +67,14 @@ StorageNamespaceProxy::~StorageNamespaceProxy() PassRefPtr<StorageNamespace> StorageNamespaceProxy::copy() { ASSERT(m_storageType == SessionStorage); - // The WebViewClient knows what its session storage namespace id is but we - // do not. Returning 0 here causes it to be fetched (via the WebViewClient) - // on its next use. Note that it is WebViewClient::createView's - // responsibility to clone the session storage namespace id and that the - // only time copy() is called is directly after the createView call...which - // is why all of this is safe. - return 0; + WebKit::WebStorageNamespace* newNamespace = m_storageNamespace->copy(); + // Some embedders hook into WebViewClient::createView to make the copy of + // session storage and then return the object lazily. Other embedders + // choose to make the copy now and return a pointer immediately. So handle + // both cases. + if (!newNamespace) + return 0; + return adoptRef(new StorageNamespaceProxy(newNamespace, m_storageType)); } PassRefPtr<StorageArea> StorageNamespaceProxy::storageArea(PassRefPtr<SecurityOrigin> origin) diff --git a/WebKit/chromium/src/SuggestionsPopupMenuClient.cpp b/WebKit/chromium/src/SuggestionsPopupMenuClient.cpp deleted file mode 100644 index b4a77a3..0000000 --- a/WebKit/chromium/src/SuggestionsPopupMenuClient.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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 "config.h" -#include "SuggestionsPopupMenuClient.h" - -#include "CSSStyleSelector.h" -#include "CSSValueKeywords.h" -#include "Chrome.h" -#include "FrameView.h" -#include "HTMLInputElement.h" -#include "RenderTheme.h" -#include "WebViewImpl.h" - -using namespace WebCore; - -namespace WebKit { - -SuggestionsPopupMenuClient::SuggestionsPopupMenuClient() - : m_textField(0) - , m_selectedIndex(0) -{ -} - -SuggestionsPopupMenuClient::~SuggestionsPopupMenuClient() -{ -} - -// FIXME: Implement this per-derived class? -void SuggestionsPopupMenuClient::valueChanged(unsigned listIndex, bool fireEvents) -{ - m_textField->setValue(getSuggestion(listIndex)); - - WebViewImpl* webView = getWebView(); - if (!webView) - return; - - EditorClientImpl* editor = - static_cast<EditorClientImpl*>(webView->page()->editorClient()); - ASSERT(editor); - editor->onAutofillSuggestionAccepted( - static_cast<HTMLInputElement*>(m_textField.get())); -} - -String SuggestionsPopupMenuClient::itemText(unsigned listIndex) const -{ - return getSuggestion(listIndex); -} - -PopupMenuStyle SuggestionsPopupMenuClient::itemStyle(unsigned listIndex) const -{ - return *m_style; -} - -PopupMenuStyle SuggestionsPopupMenuClient::menuStyle() const -{ - return *m_style; -} - -int SuggestionsPopupMenuClient::clientPaddingLeft() const -{ - // Bug http://crbug.com/7708 seems to indicate the style can be 0. - RenderStyle* style = textFieldStyle(); - if (!style) - return 0; - - return RenderTheme::defaultTheme()->popupInternalPaddingLeft(style); -} - -int SuggestionsPopupMenuClient::clientPaddingRight() const -{ - // Bug http://crbug.com/7708 seems to indicate the style can be 0. - RenderStyle* style = textFieldStyle(); - if (!style) - return 0; - - return RenderTheme::defaultTheme()->popupInternalPaddingRight(style); -} - -void SuggestionsPopupMenuClient::popupDidHide() -{ - WebViewImpl* webView = getWebView(); - if (webView) - webView->suggestionsPopupDidHide(); -} - -void SuggestionsPopupMenuClient::setTextFromItem(unsigned listIndex) -{ - m_textField->setValue(getSuggestion(listIndex)); -} - -FontSelector* SuggestionsPopupMenuClient::fontSelector() const -{ - return m_textField->document()->styleSelector()->fontSelector(); -} - -HostWindow* SuggestionsPopupMenuClient::hostWindow() const -{ - return m_textField->document()->view()->hostWindow(); -} - -PassRefPtr<Scrollbar> SuggestionsPopupMenuClient::createScrollbar( - ScrollbarClient* client, - ScrollbarOrientation orientation, - ScrollbarControlSize size) -{ - return Scrollbar::createNativeScrollbar(client, orientation, size); -} - -RenderStyle* SuggestionsPopupMenuClient::textFieldStyle() const -{ - RenderStyle* style = m_textField->computedStyle(); - if (!style) { - // It seems we can only have a 0 style in a TextField if the - // node is detached, in which case we the popup shoud not be - // showing. Please report this in http://crbug.com/7708 and - // include the page you were visiting. - ASSERT_NOT_REACHED(); - } - return style; -} - -void SuggestionsPopupMenuClient::initialize(HTMLInputElement* textField, - int defaultSuggestionIndex) -{ - m_textField = textField; - m_selectedIndex = defaultSuggestionIndex; - - FontDescription fontDescription; - RenderTheme::defaultTheme()->systemFont(CSSValueWebkitControl, - fontDescription); - - // Use a smaller font size to match IE/Firefox. - // FIXME: http://crbug.com/7376 use the system size instead of a - // fixed font size value. - fontDescription.setComputedSize(12.0); - Font font(fontDescription, 0, 0); - font.update(textField->document()->styleSelector()->fontSelector()); - // The direction of text in popup menu is set the same as the direction of - // the input element: textField. - m_style.set(new PopupMenuStyle(Color::black, Color::white, font, true, - Length(WebCore::Fixed), - textField->renderer()->style()->direction())); -} - -WebViewImpl* SuggestionsPopupMenuClient::getWebView() const -{ - Frame* frame = m_textField->document()->frame(); - if (!frame) - return 0; - - Page* page = frame->page(); - if (!page) - return 0; - - return static_cast<ChromeClientImpl*>(page->chrome()->client())->webView(); -} - -} // namespace WebKit diff --git a/WebKit/chromium/src/SuggestionsPopupMenuClient.h b/WebKit/chromium/src/SuggestionsPopupMenuClient.h deleted file mode 100644 index edc4c09..0000000 --- a/WebKit/chromium/src/SuggestionsPopupMenuClient.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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 "PopupMenuClient.h" - -#ifndef SuggestionsPopupMenuClient_h -#define SuggestionsPopupMenuClient_h - -namespace WebCore { -class HTMLInputElement; -class PopupMenuStyle; -class RenderStyle; -} - -namespace WebKit { -class WebString; -class WebViewImpl; -template <typename T> class WebVector; - -// The Suggestions popup menu client, used to display a list of suggestions. -class SuggestionsPopupMenuClient : public WebCore::PopupMenuClient { -public: - SuggestionsPopupMenuClient(); - virtual ~SuggestionsPopupMenuClient(); - - // Returns the number of suggestions available. - virtual unsigned getSuggestionsCount() const = 0; - - // Returns the suggestion at |listIndex|. - virtual WebString getSuggestion(unsigned listIndex) const = 0; - - // Removes the suggestion at |listIndex| from the list of suggestions. - virtual void removeSuggestionAtIndex(unsigned listIndex) = 0; - - // WebCore::PopupMenuClient methods: - virtual void valueChanged(unsigned listIndex, bool fireEvents = true); - virtual WebCore::String itemText(unsigned listIndex) const; - virtual WebCore::String itemToolTip(unsigned lastIndex) const { return WebCore::String(); } - virtual bool itemIsEnabled(unsigned listIndex) const { return true; } - virtual WebCore::PopupMenuStyle itemStyle(unsigned listIndex) const; - virtual WebCore::PopupMenuStyle menuStyle() const; - virtual int clientInsetLeft() const { return 0; } - virtual int clientInsetRight() const { return 0; } - virtual int clientPaddingLeft() const; - virtual int clientPaddingRight() const; - virtual int listSize() const { return getSuggestionsCount(); } - virtual int selectedIndex() const { return m_selectedIndex; } - virtual void popupDidHide(); - virtual bool itemIsSeparator(unsigned listIndex) const { return false; } - virtual bool itemIsLabel(unsigned listIndex) const { return false; } - virtual bool itemIsSelected(unsigned listIndex) const { return false; } - virtual bool shouldPopOver() const { return false; } - virtual bool valueShouldChangeOnHotTrack() const { return false; } - virtual void setTextFromItem(unsigned listIndex); - virtual WebCore::FontSelector* fontSelector() const; - virtual WebCore::HostWindow* hostWindow() const; - virtual PassRefPtr<WebCore::Scrollbar> createScrollbar( - WebCore::ScrollbarClient* client, - WebCore::ScrollbarOrientation orientation, - WebCore::ScrollbarControlSize size); - -protected: - void initialize(WebCore::HTMLInputElement* textField, - int defaultSuggestionIndex); - - int getSelectedIndex() const { return m_selectedIndex; } - void setSelectedIndex(int index) { m_selectedIndex = index; } - - WebViewImpl* getWebView() const; - WebCore::HTMLInputElement* getTextField() const { return m_textField.get(); } - -private: - WebCore::RenderStyle* textFieldStyle() const; - - RefPtr<WebCore::HTMLInputElement> m_textField; - int m_selectedIndex; - OwnPtr<WebCore::PopupMenuStyle> m_style; -}; - -} // namespace WebKit - -#endif diff --git a/WebKit/chromium/src/ToolsAgent.h b/WebKit/chromium/src/ToolsAgent.h deleted file mode 100644 index ab48153..0000000 --- a/WebKit/chromium/src/ToolsAgent.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -#ifndef ToolsAgent_h -#define ToolsAgent_h - -#include "DevToolsRPC.h" - -namespace WebKit { - -// Tools agent provides API for enabling / disabling other agents as well as -// API for auxiliary UI functions such as dom elements highlighting. -#define TOOLS_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \ - /* Dispatches given function on the InspectorController object */ \ - METHOD3(dispatchOnInspectorController, int /* call_id */, \ - String /* function_name */, String /* json_args */) \ - \ - /* Dispatches given function on the InjectedScript object */ \ - METHOD5(dispatchOnInjectedScript, int /* call_id */, \ - int /* injected_script_id */, String /* function_name */, \ - String /* json_args */, bool /* async */) - -DEFINE_RPC_CLASS(ToolsAgent, TOOLS_AGENT_STRUCT) - -#define TOOLS_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \ - /* Updates focused node on the client. */ \ - METHOD1(frameNavigate, String /* url */) \ - \ - /* Response to the DispatchOn*. */ \ - METHOD3(didDispatchOn, int /* call_id */, String /* result */, String /* exception */) \ - \ - /* Sends InspectorFrontend message to be dispatched on client. */ \ - METHOD1(dispatchOnClient, String /* data */) - -DEFINE_RPC_CLASS(ToolsAgentDelegate, TOOLS_AGENT_DELEGATE_STRUCT) - -} // namespace WebKit - -#endif diff --git a/WebKit/chromium/src/VideoFrameChromiumImpl.cpp b/WebKit/chromium/src/VideoFrameChromiumImpl.cpp new file mode 100644 index 0000000..99e3e1e --- /dev/null +++ b/WebKit/chromium/src/VideoFrameChromiumImpl.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "VideoFrameChromiumImpl.h" + +#include "VideoFrameChromium.h" +#include "WebVideoFrame.h" + +using namespace WebCore; + +namespace WebKit { + +WebVideoFrame* VideoFrameChromiumImpl::toWebVideoFrame(VideoFrameChromium* videoFrame) +{ + VideoFrameChromiumImpl* wrappedFrame = static_cast<VideoFrameChromiumImpl*>(videoFrame); + if (wrappedFrame) + return wrappedFrame->m_webVideoFrame; + return 0; +} + +VideoFrameChromiumImpl::VideoFrameChromiumImpl(WebVideoFrame* webVideoFrame) + : m_webVideoFrame(webVideoFrame) +{ +} + +VideoFrameChromium::SurfaceType VideoFrameChromiumImpl::surfaceType() const +{ + if (m_webVideoFrame) + return static_cast<VideoFrameChromium::SurfaceType>(m_webVideoFrame->surfaceType()); + return TypeSystemMemory; +} + +VideoFrameChromium::Format VideoFrameChromiumImpl::format() const +{ + if (m_webVideoFrame) + return static_cast<VideoFrameChromium::Format>(m_webVideoFrame->format()); + return Invalid; +} + +unsigned VideoFrameChromiumImpl::width() const +{ + if (m_webVideoFrame) + return m_webVideoFrame->width(); + return 0; +} + +unsigned VideoFrameChromiumImpl::height() const +{ + if (m_webVideoFrame) + return m_webVideoFrame->height(); + return 0; +} + +unsigned VideoFrameChromiumImpl::planes() const +{ + if (m_webVideoFrame) + return m_webVideoFrame->planes(); + return 0; +} + +int VideoFrameChromiumImpl::stride(unsigned plane) const +{ + if (m_webVideoFrame) + return m_webVideoFrame->stride(plane); + return 0; +} + +const void* VideoFrameChromiumImpl::data(unsigned plane) const +{ + if (m_webVideoFrame) + return m_webVideoFrame->data(plane); + return 0; +} + +unsigned VideoFrameChromiumImpl::texture(unsigned plane) const +{ + if (m_webVideoFrame) + return m_webVideoFrame->texture(plane); + return 0; +} + +const IntSize VideoFrameChromiumImpl::requiredTextureSize(unsigned plane) const +{ + switch (format()) { + case RGBA: + return IntSize(stride(plane), height()); + case YV12: + if (plane == static_cast<unsigned>(yPlane)) + return IntSize(stride(plane), height()); + else if (plane == static_cast<unsigned>(uPlane)) + return IntSize(stride(plane), height() / 2); + else if (plane == static_cast<unsigned>(vPlane)) + return IntSize(stride(plane), height() / 2); + default: + break; + } + return IntSize(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/VideoFrameChromiumImpl.h b/WebKit/chromium/src/VideoFrameChromiumImpl.h new file mode 100644 index 0000000..f86ee1c --- /dev/null +++ b/WebKit/chromium/src/VideoFrameChromiumImpl.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef VideoFrameChromiumImpl_h +#define VideoFrameChromiumImpl_h + +#include "VideoFrameChromium.h" +#include "WebVideoFrame.h" + +using namespace WebCore; + +namespace WebKit { + +// A wrapper class for WebKit::WebVideoFrame. Objects can be created in WebKit +// and used in WebCore because of the VideoFrameChromium interface. +class VideoFrameChromiumImpl : public VideoFrameChromium { +public: + // Converts a WebCore::VideoFrameChromium to a WebKit::WebVideoFrame. + static WebVideoFrame* toWebVideoFrame(VideoFrameChromium*); + + // Creates a VideoFrameChromiumImpl object to wrap the given WebVideoFrame. + // The VideoFrameChromiumImpl does not take ownership of the WebVideoFrame + // and should not free the frame's memory. + VideoFrameChromiumImpl(WebVideoFrame*); + virtual SurfaceType surfaceType() const; + virtual Format format() const; + virtual unsigned width() const; + virtual unsigned height() const; + virtual unsigned planes() const; + virtual int stride(unsigned plane) const; + virtual const void* data(unsigned plane) const; + virtual unsigned texture(unsigned plane) const; + virtual const IntSize requiredTextureSize(unsigned plane) const; + +private: + WebVideoFrame* m_webVideoFrame; +}; + +} // namespace WebKit + +#endif diff --git a/WebKit/chromium/src/WebAccessibilityCache.cpp b/WebKit/chromium/src/WebAccessibilityCache.cpp index 8a3f697..ab8f814 100644 --- a/WebKit/chromium/src/WebAccessibilityCache.cpp +++ b/WebKit/chromium/src/WebAccessibilityCache.cpp @@ -42,4 +42,9 @@ void WebAccessibilityCache::enableAccessibility() AXObjectCache::enableAccessibility(); } +bool WebAccessibilityCache::accessibilityEnabled() +{ + return AXObjectCache::accessibilityEnabled(); +} + } diff --git a/WebKit/chromium/src/WebAccessibilityCacheImpl.cpp b/WebKit/chromium/src/WebAccessibilityCacheImpl.cpp index 03e5f46..f91bd1c 100644 --- a/WebKit/chromium/src/WebAccessibilityCacheImpl.cpp +++ b/WebKit/chromium/src/WebAccessibilityCacheImpl.cpp @@ -63,15 +63,15 @@ WebAccessibilityCache* WebAccessibilityCache::create() PassRefPtr<WebAccessibilityCacheImpl::WeakHandle> WebAccessibilityCacheImpl::WeakHandle::create(AccessibilityObject* object) { - // FIXME: Remove resetting ref-count from AccessibilityObjectWrapper - // and convert to use adoptRef. - return new WebAccessibilityCacheImpl::WeakHandle(object); + RefPtr<WebAccessibilityCacheImpl::WeakHandle> weakHandle = adoptRef(new WebAccessibilityCacheImpl::WeakHandle(object)); + weakHandle->m_object->setWrapper(weakHandle.get()); + + return weakHandle.release(); } WebAccessibilityCacheImpl::WeakHandle::WeakHandle(AccessibilityObject* object) : AccessibilityObjectWrapper(object) { - m_object->setWrapper(this); } // WebAccessibilityCacheImpl ---------------------------------------- @@ -118,11 +118,6 @@ WebAccessibilityObject WebAccessibilityCacheImpl::getObjectById(int id) return WebAccessibilityObject(it->second->accessibilityObject()); } -bool WebAccessibilityCacheImpl::isValidId(int id) const -{ - return id >= firstObjectId; -} - void WebAccessibilityCacheImpl::remove(int id) { ObjectMap::iterator it = m_objectMap.find(id); @@ -148,7 +143,7 @@ void WebAccessibilityCacheImpl::clear() int WebAccessibilityCacheImpl::addOrGetId(const WebAccessibilityObject& object) { - if (object.isNull()) + if (!object.isValid()) return invalidObjectId; RefPtr<AccessibilityObject> o = toAccessibilityObject(object); @@ -166,4 +161,17 @@ int WebAccessibilityCacheImpl::addOrGetId(const WebAccessibilityObject& object) return m_nextNewId++; } +bool WebAccessibilityCacheImpl::isCached(const WebAccessibilityObject& object) +{ + if (!object.isValid()) + return false; + + RefPtr<AccessibilityObject> o = toAccessibilityObject(object); + IdMap::iterator it = m_idMap.find(o.get()); + if (it == m_idMap.end()) + return false; + + return true; +} + } diff --git a/WebKit/chromium/src/WebAccessibilityCacheImpl.h b/WebKit/chromium/src/WebAccessibilityCacheImpl.h index 5148b74..c72c0fc 100644 --- a/WebKit/chromium/src/WebAccessibilityCacheImpl.h +++ b/WebKit/chromium/src/WebAccessibilityCacheImpl.h @@ -45,8 +45,8 @@ public: virtual bool isInitialized() const { return m_initialized; } virtual WebAccessibilityObject getObjectById(int); - virtual bool isValidId(int) const; virtual int addOrGetId(const WebKit::WebAccessibilityObject&); + virtual bool isCached(const WebAccessibilityObject&); virtual void remove(int); virtual void clear(); diff --git a/WebKit/chromium/src/WebAccessibilityObject.cpp b/WebKit/chromium/src/WebAccessibilityObject.cpp index c386d44..9df69cf 100644 --- a/WebKit/chromium/src/WebAccessibilityObject.cpp +++ b/WebKit/chromium/src/WebAccessibilityObject.cpp @@ -32,9 +32,15 @@ #include "WebAccessibilityObject.h" #include "AccessibilityObject.h" +#include "CSSPrimitiveValueMappings.h" +#include "Document.h" #include "EventHandler.h" #include "FrameView.h" +#include "Node.h" #include "PlatformKeyboardEvent.h" +#include "RenderStyle.h" +#include "WebDocument.h" +#include "WebNode.h" #include "WebPoint.h" #include "WebRect.h" #include "WebString.h" @@ -95,6 +101,15 @@ bool WebAccessibilityObject::canSetValueAttribute() const return m_private->canSetValueAttribute(); } +bool WebAccessibilityObject::isValid() const +{ + if (!m_private) + return false; + + m_private->updateBackingStore(); + return m_private->axObjectID(); +} + unsigned WebAccessibilityObject::childCount() const { if (!m_private) @@ -176,6 +191,15 @@ WebAccessibilityObject WebAccessibilityObject::previousSibling() const return WebAccessibilityObject(m_private->previousSibling()); } +bool WebAccessibilityObject::canSetSelectedAttribute() const +{ + if (!m_private) + return 0; + + m_private->updateBackingStore(); + return m_private->canSetSelectedAttribute(); +} + bool WebAccessibilityObject::isAnchor() const { if (!m_private) @@ -194,6 +218,15 @@ bool WebAccessibilityObject::isChecked() const return m_private->isChecked(); } +bool WebAccessibilityObject::isCollapsed() const +{ + if (!m_private) + return 0; + + m_private->updateBackingStore(); + return m_private->isCollapsed(); +} + bool WebAccessibilityObject::isFocused() const { @@ -231,6 +264,15 @@ bool WebAccessibilityObject::isIndeterminate() const return m_private->isIndeterminate(); } +bool WebAccessibilityObject::isLinked() const +{ + if (!m_private) + return 0; + + m_private->updateBackingStore(); + return m_private->isLinked(); +} + bool WebAccessibilityObject::isMultiSelectable() const { if (!m_private) @@ -276,6 +318,24 @@ bool WebAccessibilityObject::isReadOnly() const return m_private->isReadOnly(); } +bool WebAccessibilityObject::isSelected() const +{ + if (!m_private) + return 0; + + m_private->updateBackingStore(); + return m_private->isSelected(); +} + +bool WebAccessibilityObject::isVisible() const +{ + if (!m_private) + return 0; + + m_private->updateBackingStore(); + return m_private->isVisible(); +} + bool WebAccessibilityObject::isVisited() const { if (!m_private) @@ -291,7 +351,7 @@ WebRect WebAccessibilityObject::boundingBoxRect() const return WebRect(); m_private->updateBackingStore(); - return m_private->documentFrameView()->contentsToWindow(m_private->boundingBoxRect()); + return m_private->boundingBoxRect(); } WebString WebAccessibilityObject::helpText() const @@ -303,6 +363,15 @@ WebString WebAccessibilityObject::helpText() const return m_private->helpText(); } +int WebAccessibilityObject::headingLevel() const +{ + if (!m_private) + return 0; + + m_private->updateBackingStore(); + return m_private->headingLevel(); +} + WebAccessibilityObject WebAccessibilityObject::hitTest(const WebPoint& point) const { if (!m_private) @@ -368,6 +437,12 @@ WebAccessibilityRole WebAccessibilityObject::roleValue() const return static_cast<WebAccessibilityRole>(m_private->roleValue()); } +void WebAccessibilityObject::setFocused(bool on) const +{ + if (m_private) + m_private->setFocused(on); +} + WebString WebAccessibilityObject::stringValue() const { if (!m_private) @@ -386,6 +461,65 @@ WebString WebAccessibilityObject::title() const return m_private->title(); } + +WebNode WebAccessibilityObject::node() const +{ + if (!m_private) + return WebNode(); + + m_private->updateBackingStore(); + + Node* node = m_private->node(); + if (!node) + return WebNode(); + + return WebNode(node); +} + +WebDocument WebAccessibilityObject::document() const +{ + if (!m_private) + return WebDocument(); + + m_private->updateBackingStore(); + + Document* document = m_private->document(); + if (!document) + return WebDocument(); + + return WebDocument(document); +} + +bool WebAccessibilityObject::hasComputedStyle() const +{ + Document* document = m_private->document(); + if (document) + document->updateStyleIfNeeded(); + + Node* node = m_private->node(); + if (!node) + return false; + + return node->computedStyle(); +} + +WebString WebAccessibilityObject::computedStyleDisplay() const +{ + Document* document = m_private->document(); + if (document) + document->updateStyleIfNeeded(); + + Node* node = m_private->node(); + if (!node) + return WebString(); + + RenderStyle* renderStyle = node->computedStyle(); + if (!renderStyle) + return WebString(); + + return WebString(CSSPrimitiveValue::create(renderStyle->display())->getStringValue()); +} + WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object) : m_private(static_cast<WebAccessibilityObjectPrivate*>(object.releaseRef())) { diff --git a/WebKit/chromium/src/WebAnimationControllerImpl.cpp b/WebKit/chromium/src/WebAnimationControllerImpl.cpp index 32a7a61..e6eb828 100644 --- a/WebKit/chromium/src/WebAnimationControllerImpl.cpp +++ b/WebKit/chromium/src/WebAnimationControllerImpl.cpp @@ -87,4 +87,24 @@ unsigned WebAnimationControllerImpl::numberOfActiveAnimations() const return controller->numberOfActiveAnimations(); } +void WebAnimationControllerImpl::suspendAnimations() const +{ + AnimationController* controller = animationController(); + if (!controller) + return; + if (!m_frameImpl->frame()) + return; + controller->suspendAnimations(); +} + +void WebAnimationControllerImpl::resumeAnimations() const +{ + AnimationController* controller = animationController(); + if (!controller) + return; + if (!m_frameImpl->frame()) + return; + controller->resumeAnimations(); +} + } // namespace WebKit diff --git a/WebKit/chromium/src/WebAnimationControllerImpl.h b/WebKit/chromium/src/WebAnimationControllerImpl.h index 8b0676e..62b89f0 100644 --- a/WebKit/chromium/src/WebAnimationControllerImpl.h +++ b/WebKit/chromium/src/WebAnimationControllerImpl.h @@ -31,9 +31,7 @@ #ifndef WebAnimationControllerImpl_h #define WebAnimationControllerImpl_h -// FIXME: This relative path is a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebAnimationController.h" +#include "WebAnimationController.h" namespace WebCore { class AnimationController; @@ -54,6 +52,8 @@ public: const WebString& propertyName, double time); virtual unsigned numberOfActiveAnimations() const; + virtual void suspendAnimations() const; + virtual void resumeAnimations() const; private: WebFrameImpl* m_frameImpl; WebCore::AnimationController* animationController() const; diff --git a/WebKit/chromium/src/WebAttribute.cpp b/WebKit/chromium/src/WebAttribute.cpp new file mode 100644 index 0000000..0bc3b91 --- /dev/null +++ b/WebKit/chromium/src/WebAttribute.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebAttribute.h" + +#include "Attribute.h" +#include <wtf/PassRefPtr.h> + +#include "WebString.h" + +using namespace WebCore; + +namespace WebKit { + +void WebAttribute::reset() +{ + m_private.reset(); +} + +void WebAttribute::assign(const WebAttribute& other) +{ + m_private = other.m_private; +} + +WebAttribute::WebAttribute(const PassRefPtr<Attribute>& other) + : m_private(other) +{ +} + +WebString WebAttribute::localName() const +{ + return WebString(m_private->localName()); +} + +WebString WebAttribute::value() const +{ + return WebString(m_private->value()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebAudioBus.cpp b/WebKit/chromium/src/WebAudioBus.cpp new file mode 100644 index 0000000..ceccafc --- /dev/null +++ b/WebKit/chromium/src/WebAudioBus.cpp @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2010, Google 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. AND ITS CONTRIBUTORS ``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 ITS 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 "config.h" +#include "WebAudioBus.h" + +#if ENABLE(WEB_AUDIO) +#include "AudioBus.h" +#else +namespace WebCore { +class AudioBus { +}; +} // namespace WebCore +#endif + +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> + +using namespace WebCore; + +namespace WebKit { + +class WebAudioBusPrivate : public AudioBus { +}; + +WebAudioBus::~WebAudioBus() +{ +#if ENABLE(WEB_AUDIO) + delete m_private; + m_private = 0; +#endif +} + +void WebAudioBus::initialize(unsigned numberOfChannels, size_t length, double sampleRate) +{ +#if ENABLE(WEB_AUDIO) + AudioBus* audioBus = new AudioBus(numberOfChannels, length); + audioBus->setSampleRate(sampleRate); + + if (m_private) + delete m_private; + m_private = static_cast<WebAudioBusPrivate*>(audioBus); +#else + ASSERT_NOT_REACHED(); +#endif +} + +unsigned WebAudioBus::numberOfChannels() const +{ +#if ENABLE(WEB_AUDIO) + if (!m_private) + return 0; + return m_private->numberOfChannels(); +#else + ASSERT_NOT_REACHED(); + return 0; +#endif +} + +size_t WebAudioBus::length() const +{ +#if ENABLE(WEB_AUDIO) + if (!m_private) + return 0; + return m_private->length(); +#else + ASSERT_NOT_REACHED(); + return 0; +#endif +} + +double WebAudioBus::sampleRate() const +{ +#if ENABLE(WEB_AUDIO) + if (!m_private) + return 0; + return m_private->sampleRate(); +#else + ASSERT_NOT_REACHED(); + return 0; +#endif +} + +float* WebAudioBus::channelData(unsigned channelIndex) +{ +#if ENABLE(WEB_AUDIO) + if (!m_private) + return 0; + ASSERT(channelIndex < numberOfChannels()); + return m_private->channel(channelIndex)->data(); +#else + ASSERT_NOT_REACHED(); + return 0; +#endif +} + +PassOwnPtr<AudioBus> WebAudioBus::release() +{ +#if ENABLE(WEB_AUDIO) + OwnPtr<AudioBus> audioBus(adoptPtr(static_cast<AudioBus*>(m_private))); + m_private = 0; + return audioBus.release(); +#else + ASSERT_NOT_REACHED(); + return 0; +#endif +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebBindings.cpp b/WebKit/chromium/src/WebBindings.cpp index 04f2f85..0882e38 100644 --- a/WebKit/chromium/src/WebBindings.cpp +++ b/WebKit/chromium/src/WebBindings.cpp @@ -34,9 +34,6 @@ #include "npruntime_impl.h" #include "npruntime_priv.h" -#include "../public/WebDragData.h" -#include "../public/WebRange.h" - #if USE(V8) #include "ChromiumDataObject.h" #include "ClipboardChromium.h" @@ -46,13 +43,19 @@ #include "Range.h" #include "V8BindingState.h" #include "V8DOMWrapper.h" +#include "V8Element.h" #include "V8Event.h" #include "V8Helpers.h" +#include "V8HiddenPropertyName.h" +#include "V8NPUtils.h" #include "V8Proxy.h" #include "V8Range.h" #elif USE(JSC) #include "bridge/c/c_utility.h" #endif +#include "WebDragData.h" +#include "WebElement.h" +#include "WebRange.h" #if USE(JAVASCRIPTCORE_BINDINGS) using JSC::Bindings::PrivateIdentifier; @@ -208,8 +211,7 @@ void WebBindings::extractIdentifierData(const NPIdentifier& identifier, const NP static v8::Local<v8::Value> getEvent(const v8::Handle<v8::Context>& context) { - static v8::Persistent<v8::String> eventSymbol(v8::Persistent<v8::String>::New(v8::String::NewSymbol("event"))); - return context->Global()->GetHiddenValue(eventSymbol); + return context->Global()->GetHiddenValue(V8HiddenPropertyName::event()); } static bool getDragDataImpl(NPObject* npobj, int* eventId, WebDragData* data) @@ -284,7 +286,7 @@ static bool getRangeImpl(NPObject* npobj, WebRange* range) { V8NPObject* v8npobject = reinterpret_cast<V8NPObject*>(npobj); v8::Handle<v8::Object> v8object(v8npobject->v8Object); - if (V8ClassIndex::RANGE != V8DOMWrapper::domWrapperType(v8object)) + if (!V8Range::info.equals(V8DOMWrapper::domWrapperType(v8object))) return false; Range* native = V8Range::toNative(v8object); @@ -295,6 +297,43 @@ static bool getRangeImpl(NPObject* npobj, WebRange* range) return true; } +static bool getElementImpl(NPObject* npObj, WebElement* webElement) +{ + if (!npObj || (npObj->_class != npScriptObjectClass)) + return false; + + V8NPObject* v8NPObject = reinterpret_cast<V8NPObject*>(npObj); + v8::Handle<v8::Object> v8Object(v8NPObject->v8Object); + Element* native = V8Element::toNative(v8Object); + if (!native) + return false; + + *webElement = WebElement(native); + return true; +} + +static NPObject* makeIntArrayImpl(const WebVector<int>& data) +{ + v8::HandleScope handleScope; + v8::Handle<v8::Array> result = v8::Array::New(data.size()); + for (size_t i = 0; i < data.size(); i++) + result->Set(i, v8::Number::New(data[i])); + + WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow(WebCore::V8Proxy::currentContext()); + return npCreateV8ScriptObject(0, result, window); +} + +static NPObject* makeStringArrayImpl(const WebVector<WebString>& data) +{ + v8::HandleScope handleScope; + v8::Handle<v8::Array> result = v8::Array::New(data.size()); + for (size_t i = 0; i < data.size(); ++i) + result->Set(i, data[i].data() ? v8::String::New(reinterpret_cast<const uint16_t*>((data[i].data())), data[i].length()) : v8::String::New("")); + + WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow(WebCore::V8Proxy::currentContext()); + return npCreateV8ScriptObject(0, result, window); +} + #endif bool WebBindings::getDragData(NPObject* event, int* eventId, WebDragData* data) @@ -323,4 +362,44 @@ bool WebBindings::getRange(NPObject* range, WebRange* webrange) #endif } +bool WebBindings::getElement(NPObject* element, WebElement* webElement) +{ +#if USE(V8) + return getElementImpl(element, webElement); +#else + // Not supported on other ports (JSC, etc.). + return false; +#endif +} + +NPObject* WebBindings::makeIntArray(const WebVector<int> & data) +{ +#if USE(V8) + return makeIntArrayImpl(data); +#else + // Not supported on other ports (JSC, etc.). + return 0; +#endif +} + +NPObject* WebBindings::makeStringArray(const WebVector<WebString>& data) +{ +#if USE(V8) + return makeStringArrayImpl(data); +#else + // Not supported on other ports (JSC, etc.). + return 0; +#endif +} + +void WebBindings::pushExceptionHandler(ExceptionHandler handler, void* data) +{ + WebCore::pushExceptionHandler(handler, data); +} + +void WebBindings::popExceptionHandler() +{ + WebCore::popExceptionHandler(); +} + } // namespace WebKit diff --git a/WebKit/chromium/src/WebBlobData.cpp b/WebKit/chromium/src/WebBlobData.cpp new file mode 100644 index 0000000..42018dd --- /dev/null +++ b/WebKit/chromium/src/WebBlobData.cpp @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebBlobData.h" + +#include "BlobData.h" +#include <wtf/PassOwnPtr.h> + +using namespace WebCore; + +namespace WebKit { + +class WebBlobDataPrivate : public BlobData { +}; + +void WebBlobData::initialize() +{ + assign(BlobData::create()); +} + +void WebBlobData::reset() +{ + assign(0); +} + +size_t WebBlobData::itemCount() const +{ + ASSERT(!isNull()); + return m_private->items().size(); +} + +bool WebBlobData::itemAt(size_t index, Item& result) const +{ + ASSERT(!isNull()); + + if (index >= m_private->items().size()) + return false; + + const BlobDataItem& item = m_private->items()[index]; + result.data.reset(); + result.filePath.reset(); + result.blobURL = KURL(); + result.offset = item.offset; + result.length = item.length; + result.expectedModificationTime = item.expectedModificationTime; + + switch (item.type) { + case BlobDataItem::Data: + result.type = Item::TypeData; + result.data = item.data; + return true; + case BlobDataItem::File: + result.type = Item::TypeFile; + result.filePath = item.path; + return true; + case BlobDataItem::Blob: + result.type = Item::TypeBlob; + result.blobURL = item.url; + return true; + } + ASSERT_NOT_REACHED(); + return false; +} + +WebString WebBlobData::contentType() const +{ + ASSERT(!isNull()); + return m_private->contentType(); +} + +WebString WebBlobData::contentDisposition() const +{ + ASSERT(!isNull()); + return m_private->contentDisposition(); +} + +WebBlobData::WebBlobData(const PassOwnPtr<BlobData>& data) + : m_private(0) +{ + assign(data); +} + +WebBlobData& WebBlobData::operator=(const PassOwnPtr<BlobData>& data) +{ + assign(data); + return *this; +} + +WebBlobData::operator PassOwnPtr<BlobData>() +{ + WebBlobDataPrivate* temp = m_private; + m_private = 0; + return adoptPtr(temp); +} + +void WebBlobData::assign(const PassOwnPtr<BlobData>& data) +{ + if (m_private) + delete m_private; + m_private = static_cast<WebBlobDataPrivate*>(data.leakPtr()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebCString.cpp b/WebKit/chromium/src/WebCString.cpp index 82fbac0..f81d7f4 100644 --- a/WebKit/chromium/src/WebCString.cpp +++ b/WebKit/chromium/src/WebCString.cpp @@ -31,16 +31,28 @@ #include "config.h" #include "WebCString.h" -#include "CString.h" #include "TextEncoding.h" +#include <wtf/text/CString.h> #include "WebString.h" namespace WebKit { -class WebCStringPrivate : public WebCore::CStringBuffer { +class WebCStringPrivate : public WTF::CStringBuffer { }; +int WebCString::compare(const WebCString& other) const +{ + // A null string is always less than a non null one. + if (isNull() != other.isNull()) + return isNull() ? -1 : 1; + + if (isNull()) + return 0; // Both WebStrings are null. + + return strcmp(m_private->data(), other.m_private->data()); +} + void WebCString::reset() { if (m_private) { @@ -57,8 +69,8 @@ void WebCString::assign(const WebCString& other) void WebCString::assign(const char* data, size_t length) { char* newData; - RefPtr<WebCore::CStringBuffer> buffer = - WebCore::CString::newUninitialized(length, newData).buffer(); + RefPtr<WTF::CStringBuffer> buffer = + WTF::CString::newUninitialized(length, newData).buffer(); memcpy(newData, data, length); assign(static_cast<WebCStringPrivate*>(buffer.get())); } @@ -97,20 +109,20 @@ WebCString WebCString::fromUTF16(const WebUChar* data) return fromUTF16(data, len); } -WebCString::WebCString(const WebCore::CString& s) +WebCString::WebCString(const WTF::CString& s) : m_private(static_cast<WebCStringPrivate*>(s.buffer())) { if (m_private) m_private->ref(); } -WebCString& WebCString::operator=(const WebCore::CString& s) +WebCString& WebCString::operator=(const WTF::CString& s) { assign(static_cast<WebCStringPrivate*>(s.buffer())); return *this; } -WebCString::operator WebCore::CString() const +WebCString::operator WTF::CString() const { return m_private; } diff --git a/WebKit/chromium/src/WebCache.cpp b/WebKit/chromium/src/WebCache.cpp index 9d03a4d..2203498 100644 --- a/WebKit/chromium/src/WebCache.cpp +++ b/WebKit/chromium/src/WebCache.cpp @@ -31,20 +31,20 @@ #include "config.h" #include "WebCache.h" -// Instead of providing accessors, we make all members of Cache public. -// This will make it easier to track WebCore changes to the Cache class. -// FIXME: We should introduce public getters on the Cache class. +// Instead of providing accessors, we make all members of MemoryCache public. +// This will make it easier to track WebCore changes to the MemoryCache class. +// FIXME: We should introduce public getters on the MemoryCache class. #define private public -#include "Cache.h" +#include "MemoryCache.h" #undef private using namespace WebCore; namespace WebKit { -// A helper method for coverting a Cache::TypeStatistic to a +// A helper method for coverting a MemoryCache::TypeStatistic to a // WebCache::ResourceTypeStat. -static void ToResourceTypeStat(const Cache::TypeStatistic& from, +static void ToResourceTypeStat(const MemoryCache::TypeStatistic& from, WebCache::ResourceTypeStat& to) { to.count = static_cast<size_t>(from.count); @@ -56,7 +56,7 @@ static void ToResourceTypeStat(const Cache::TypeStatistic& from, void WebCache::setCapacities( size_t minDeadCapacity, size_t maxDeadCapacity, size_t capacity) { - Cache* cache = WebCore::cache(); + MemoryCache* cache = WebCore::cache(); if (cache) cache->setCapacities(static_cast<unsigned int>(minDeadCapacity), static_cast<unsigned int>(maxDeadCapacity), @@ -65,17 +65,10 @@ void WebCache::setCapacities( void WebCache::clear() { - Cache* cache = WebCore::cache(); + MemoryCache* cache = WebCore::cache(); if (cache && !cache->disabled()) { - // NOTE: I think using setDisabled() instead of setCapacities() will - // remove from the cache items that won't actually be freed from memory - // (due to other live references to them), so it just results in wasting - // time later and not saving memory compared to the below technique. - unsigned minDeadCapacity = cache->m_minDeadCapacity; - unsigned maxDeadCapacity = cache->m_maxDeadCapacity; - unsigned capacity = cache->m_capacity; - cache->setCapacities(0, 0, 0); // Will prune the cache. - cache->setCapacities(minDeadCapacity, maxDeadCapacity, capacity); + cache->setDisabled(true); + cache->setDisabled(false); } } @@ -83,7 +76,7 @@ void WebCache::getUsageStats(UsageStats* result) { ASSERT(result); - Cache* cache = WebCore::cache(); + MemoryCache* cache = WebCore::cache(); if (cache) { result->minDeadCapacity = cache->m_minDeadCapacity; result->maxDeadCapacity = cache->m_maxDeadCapacity; @@ -96,9 +89,9 @@ void WebCache::getUsageStats(UsageStats* result) void WebCache::getResourceTypeStats(ResourceTypeStats* result) { - Cache* cache = WebCore::cache(); + MemoryCache* cache = WebCore::cache(); if (cache) { - Cache::Statistics stats = cache->getStatistics(); + MemoryCache::Statistics stats = cache->getStatistics(); ToResourceTypeStat(stats.images, result->images); ToResourceTypeStat(stats.cssStyleSheets, result->cssStyleSheets); ToResourceTypeStat(stats.scripts, result->scripts); diff --git a/WebKit/chromium/src/WebCommon.cpp b/WebKit/chromium/src/WebCommon.cpp new file mode 100644 index 0000000..f9457fb --- /dev/null +++ b/WebKit/chromium/src/WebCommon.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebCommon.h" + +#include <wtf/Assertions.h> + +namespace WebKit { + +void failedAssertion(const char* file, int line, const char* function, const char* assertion) +{ + WTFReportAssertionFailure(file, line, function, assertion); + CRASH(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebEvent.cpp b/WebKit/chromium/src/WebDOMEvent.cpp index 8c68959..48e5268 100644 --- a/WebKit/chromium/src/WebEvent.cpp +++ b/WebKit/chromium/src/WebDOMEvent.cpp @@ -29,7 +29,7 @@ */ #include "config.h" -#include "WebEvent.h" +#include "WebDOMEvent.h" #include "Event.h" #include "Node.h" @@ -37,23 +37,23 @@ namespace WebKit { -class WebEventPrivate : public WebCore::Event { +class WebDOMEventPrivate : public WebCore::Event { }; -void WebEvent::reset() +void WebDOMEvent::reset() { assign(0); } -void WebEvent::assign(const WebEvent& other) +void WebDOMEvent::assign(const WebDOMEvent& other) { - WebEventPrivate* p = const_cast<WebEventPrivate*>(other.m_private); + WebDOMEventPrivate* p = const_cast<WebDOMEventPrivate*>(other.m_private); if (p) p->ref(); assign(p); } -void WebEvent::assign(WebEventPrivate* p) +void WebDOMEvent::assign(WebDOMEventPrivate* p) { // p is already ref'd for us by the caller if (m_private) @@ -61,156 +61,156 @@ void WebEvent::assign(WebEventPrivate* p) m_private = p; } -WebEvent::WebEvent(const WTF::PassRefPtr<WebCore::Event>& event) - : m_private(static_cast<WebEventPrivate*>(event.releaseRef())) +WebDOMEvent::WebDOMEvent(const WTF::PassRefPtr<WebCore::Event>& event) + : m_private(static_cast<WebDOMEventPrivate*>(event.releaseRef())) { } -WebString WebEvent::type() const +WebString WebDOMEvent::type() const { ASSERT(m_private); return m_private->type(); } -WebNode WebEvent::target() const +WebNode WebDOMEvent::target() const { ASSERT(m_private); return WebNode(m_private->target()->toNode()); } -WebNode WebEvent::currentTarget() const +WebNode WebDOMEvent::currentTarget() const { ASSERT(m_private); return WebNode(m_private->currentTarget()->toNode()); } -WebEvent::PhaseType WebEvent::eventPhase() const +WebDOMEvent::PhaseType WebDOMEvent::eventPhase() const { ASSERT(m_private); - return static_cast<WebEvent::PhaseType>(m_private->eventPhase()); + return static_cast<WebDOMEvent::PhaseType>(m_private->eventPhase()); } -bool WebEvent::bubbles() const +bool WebDOMEvent::bubbles() const { ASSERT(m_private); return m_private->bubbles(); } -bool WebEvent::cancelable() const +bool WebDOMEvent::cancelable() const { ASSERT(m_private); return m_private->cancelable(); } -bool WebEvent::isUIEvent() const +bool WebDOMEvent::isUIEvent() const { ASSERT(m_private); return m_private->isUIEvent(); } -bool WebEvent::isMouseEvent() const +bool WebDOMEvent::isMouseEvent() const { ASSERT(m_private); return m_private->isMouseEvent(); } -bool WebEvent::isMutationEvent() const +bool WebDOMEvent::isMutationEvent() const { ASSERT(m_private); return m_private->isMutationEvent(); } -bool WebEvent::isKeyboardEvent() const +bool WebDOMEvent::isKeyboardEvent() const { ASSERT(m_private); return m_private->isKeyboardEvent(); } -bool WebEvent::isTextEvent() const +bool WebDOMEvent::isTextEvent() const { ASSERT(m_private); return m_private->isTextEvent(); } -bool WebEvent::isCompositionEvent() const +bool WebDOMEvent::isCompositionEvent() const { ASSERT(m_private); return m_private->isCompositionEvent(); } -bool WebEvent::isDragEvent() const +bool WebDOMEvent::isDragEvent() const { ASSERT(m_private); return m_private->isDragEvent(); } -bool WebEvent::isClipboardEvent() const +bool WebDOMEvent::isClipboardEvent() const { ASSERT(m_private); return m_private->isClipboardEvent(); } -bool WebEvent::isMessageEvent() const +bool WebDOMEvent::isMessageEvent() const { ASSERT(m_private); return m_private->isMessageEvent(); } -bool WebEvent::isWheelEvent() const +bool WebDOMEvent::isWheelEvent() const { ASSERT(m_private); return m_private->isWheelEvent(); } -bool WebEvent::isBeforeTextInsertedEvent() const +bool WebDOMEvent::isBeforeTextInsertedEvent() const { ASSERT(m_private); return m_private->isBeforeTextInsertedEvent(); } -bool WebEvent::isOverflowEvent() const +bool WebDOMEvent::isOverflowEvent() const { ASSERT(m_private); return m_private->isOverflowEvent(); } -bool WebEvent::isPageTransitionEvent() const +bool WebDOMEvent::isPageTransitionEvent() const { ASSERT(m_private); return m_private->isPageTransitionEvent(); } -bool WebEvent::isPopStateEvent() const +bool WebDOMEvent::isPopStateEvent() const { ASSERT(m_private); return m_private->isPopStateEvent(); } -bool WebEvent::isProgressEvent() const +bool WebDOMEvent::isProgressEvent() const { ASSERT(m_private); return m_private->isProgressEvent(); } -bool WebEvent::isXMLHttpRequestProgressEvent() const +bool WebDOMEvent::isXMLHttpRequestProgressEvent() const { ASSERT(m_private); return m_private->isXMLHttpRequestProgressEvent(); } -bool WebEvent::isWebKitAnimationEvent() const +bool WebDOMEvent::isWebKitAnimationEvent() const { ASSERT(m_private); return m_private->isWebKitAnimationEvent(); } -bool WebEvent::isWebKitTransitionEvent() const +bool WebDOMEvent::isWebKitTransitionEvent() const { ASSERT(m_private); return m_private->isWebKitTransitionEvent(); } -bool WebEvent::isBeforeLoadEvent() const +bool WebDOMEvent::isBeforeLoadEvent() const { ASSERT(m_private); return m_private->isBeforeLoadEvent(); diff --git a/WebKit/chromium/src/WebEventListener.cpp b/WebKit/chromium/src/WebDOMEventListener.cpp index 8d9a887..93c1640 100644 --- a/WebKit/chromium/src/WebEventListener.cpp +++ b/WebKit/chromium/src/WebDOMEventListener.cpp @@ -1,64 +1,64 @@ -/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 THE COPYRIGHT
- * OWNER 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 "config.h"
-#include "WebEventListener.h"
-
-#include "WebEventListenerPrivate.h"
-
-namespace WebKit {
-
-WebEventListener::WebEventListener()
- : m_private(new WebEventListenerPrivate(this))
-{
-}
-
-WebEventListener::~WebEventListener()
-{
- m_private->webEventListenerDeleted();
- delete m_private;
-}
-
-void WebEventListener::notifyEventListenerDeleted(EventListenerWrapper* wrapper)
-{
- m_private->eventListenerDeleted(wrapper);
-}
-
-EventListenerWrapper* WebEventListener::createEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
-{
- return m_private->createEventListenerWrapper(eventType, useCapture, node);
-}
-
-EventListenerWrapper* WebEventListener::getEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
-{
- return m_private->getEventListenerWrapper(eventType, useCapture, node);
-}
-
-} // namespace WebKit
+/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebDOMEventListener.h" + +#include "WebDOMEventListenerPrivate.h" + +namespace WebKit { + +WebDOMEventListener::WebDOMEventListener() + : m_private(new WebDOMEventListenerPrivate(this)) +{ +} + +WebDOMEventListener::~WebDOMEventListener() +{ + m_private->webDOMEventListenerDeleted(); + delete m_private; +} + +void WebDOMEventListener::notifyEventListenerDeleted(EventListenerWrapper* wrapper) +{ + m_private->eventListenerDeleted(wrapper); +} + +EventListenerWrapper* WebDOMEventListener::createEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node) +{ + return m_private->createEventListenerWrapper(eventType, useCapture, node); +} + +EventListenerWrapper* WebDOMEventListener::getEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node) +{ + return m_private->getEventListenerWrapper(eventType, useCapture, node); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebEventListenerPrivate.cpp b/WebKit/chromium/src/WebDOMEventListenerPrivate.cpp index bd14baf..4edbeef 100644 --- a/WebKit/chromium/src/WebEventListenerPrivate.cpp +++ b/WebKit/chromium/src/WebDOMEventListenerPrivate.cpp @@ -1,87 +1,87 @@ -/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 THE COPYRIGHT
- * OWNER 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 "config.h"
-#include "WebEventListenerPrivate.h"
-
-#include "EventListenerWrapper.h"
-#include "WebEventListener.h"
-
-namespace WebKit {
-
-WebEventListenerPrivate::WebEventListenerPrivate(WebEventListener* webEventListener)
- : m_webEventListener(webEventListener)
-{
-}
-
-WebEventListenerPrivate::~WebEventListenerPrivate()
-{
-}
-
-EventListenerWrapper* WebEventListenerPrivate::createEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
-{
- EventListenerWrapper* listenerWrapper = new EventListenerWrapper(m_webEventListener);
- WebEventListenerPrivate::ListenerInfo listenerInfo(eventType, useCapture, listenerWrapper, node);
- m_listenerWrappers.append(listenerInfo);
- return listenerWrapper;
-}
-
-EventListenerWrapper* WebEventListenerPrivate::getEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
-{
- Vector<WebEventListenerPrivate::ListenerInfo>::const_iterator iter;
- for (iter = m_listenerWrappers.begin(); iter != m_listenerWrappers.end(); ++iter) {
- if (iter->node == node)
- return iter->eventListenerWrapper;
- }
- ASSERT_NOT_REACHED();
- return 0;
-}
-
-void WebEventListenerPrivate::webEventListenerDeleted()
-{
- // Notifies all WebEventListenerWrappers that we are going away so they can
- // invalidate their pointer to us.
- Vector<WebEventListenerPrivate::ListenerInfo>::const_iterator iter;
- for (iter = m_listenerWrappers.begin(); iter != m_listenerWrappers.end(); ++iter)
- iter->eventListenerWrapper->webEventListenerDeleted();
-}
-
-void WebEventListenerPrivate::eventListenerDeleted(EventListenerWrapper* eventListener)
-{
- for (size_t i = 0; i < m_listenerWrappers.size(); ++i) {
- if (m_listenerWrappers[i].eventListenerWrapper == eventListener) {
- m_listenerWrappers.remove(i);
- return;
- }
- }
- ASSERT_NOT_REACHED();
-}
-
-} // namespace WebKit
+/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebDOMEventListenerPrivate.h" + +#include "EventListenerWrapper.h" +#include "WebDOMEventListener.h" + +namespace WebKit { + +WebDOMEventListenerPrivate::WebDOMEventListenerPrivate(WebDOMEventListener* webDOMEventListener) + : m_webDOMEventListener(webDOMEventListener) +{ +} + +WebDOMEventListenerPrivate::~WebDOMEventListenerPrivate() +{ +} + +EventListenerWrapper* WebDOMEventListenerPrivate::createEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node) +{ + EventListenerWrapper* listenerWrapper = new EventListenerWrapper(m_webDOMEventListener); + WebDOMEventListenerPrivate::ListenerInfo listenerInfo(eventType, useCapture, listenerWrapper, node); + m_listenerWrappers.append(listenerInfo); + return listenerWrapper; +} + +EventListenerWrapper* WebDOMEventListenerPrivate::getEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node) +{ + Vector<WebDOMEventListenerPrivate::ListenerInfo>::const_iterator iter; + for (iter = m_listenerWrappers.begin(); iter != m_listenerWrappers.end(); ++iter) { + if (iter->node == node) + return iter->eventListenerWrapper; + } + ASSERT_NOT_REACHED(); + return 0; +} + +void WebDOMEventListenerPrivate::webDOMEventListenerDeleted() +{ + // Notifies all WebDOMEventListenerWrappers that we are going away so they can + // invalidate their pointer to us. + Vector<WebDOMEventListenerPrivate::ListenerInfo>::const_iterator iter; + for (iter = m_listenerWrappers.begin(); iter != m_listenerWrappers.end(); ++iter) + iter->eventListenerWrapper->webDOMEventListenerDeleted(); +} + +void WebDOMEventListenerPrivate::eventListenerDeleted(EventListenerWrapper* eventListener) +{ + for (size_t i = 0; i < m_listenerWrappers.size(); ++i) { + if (m_listenerWrappers[i].eventListenerWrapper == eventListener) { + m_listenerWrappers.remove(i); + return; + } + } + ASSERT_NOT_REACHED(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebEventListenerPrivate.h b/WebKit/chromium/src/WebDOMEventListenerPrivate.h index 0ba2b5d..c86f427 100644 --- a/WebKit/chromium/src/WebEventListenerPrivate.h +++ b/WebKit/chromium/src/WebDOMEventListenerPrivate.h @@ -1,95 +1,95 @@ -/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 THE COPYRIGHT
- * OWNER 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.
- */
-
-#ifndef WebEventListenerPrivate_h
-#define WebEventListenerPrivate_h
-
-#include "WebString.h"
-
-#include <wtf/Vector.h>
-
-namespace WebCore {
-class Node;
-}
-
-using namespace WebCore;
-
-namespace WebKit {
-
-class EventListenerWrapper;
-class WebEventListener;
-
-class WebEventListenerPrivate {
-public:
- WebEventListenerPrivate(WebEventListener* webEventListener);
- ~WebEventListenerPrivate();
-
- EventListenerWrapper* createEventListenerWrapper(
- const WebString& eventType, bool useCapture, Node* node);
-
- // Gets the ListenerEventWrapper for a specific node.
- // Used by WebNode::removeEventListener().
- EventListenerWrapper* getEventListenerWrapper(
- const WebString& eventType, bool useCapture, Node* node);
-
- // Called by the WebEventListener when it is about to be deleted.
- void webEventListenerDeleted();
-
- // Called by the EventListenerWrapper when it is about to be deleted.
- void eventListenerDeleted(EventListenerWrapper* eventListener);
-
- struct ListenerInfo {
- ListenerInfo(const WebString& eventType, bool useCapture,
- EventListenerWrapper* eventListenerWrapper,
- Node* node)
- : eventType(eventType)
- , useCapture(useCapture)
- , eventListenerWrapper(eventListenerWrapper)
- , node(node)
- {
- }
-
- WebString eventType;
- bool useCapture;
- EventListenerWrapper* eventListenerWrapper;
- Node* node;
- };
-
-private:
- WebEventListener* m_webEventListener;
-
- // We keep a list of the wrapper for the WebKit EventListener, it is needed
- // to implement WebNode::removeEventListener().
- Vector<ListenerInfo> m_listenerWrappers;
-};
-
-} // namespace WebKit
-
-#endif
+/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WebDOMEventListenerPrivate_h +#define WebDOMEventListenerPrivate_h + +#include "WebString.h" + +#include <wtf/Vector.h> + +namespace WebCore { +class Node; +} + +using namespace WebCore; + +namespace WebKit { + +class EventListenerWrapper; +class WebDOMEventListener; + +class WebDOMEventListenerPrivate { +public: + WebDOMEventListenerPrivate(WebDOMEventListener* webDOMEventListener); + ~WebDOMEventListenerPrivate(); + + EventListenerWrapper* createEventListenerWrapper( + const WebString& eventType, bool useCapture, Node* node); + + // Gets the ListenerEventWrapper for a specific node. + // Used by WebNode::removeDOMEventListener(). + EventListenerWrapper* getEventListenerWrapper( + const WebString& eventType, bool useCapture, Node* node); + + // Called by the WebDOMEventListener when it is about to be deleted. + void webDOMEventListenerDeleted(); + + // Called by the EventListenerWrapper when it is about to be deleted. + void eventListenerDeleted(EventListenerWrapper* eventListener); + + struct ListenerInfo { + ListenerInfo(const WebString& eventType, bool useCapture, + EventListenerWrapper* eventListenerWrapper, + Node* node) + : eventType(eventType) + , useCapture(useCapture) + , eventListenerWrapper(eventListenerWrapper) + , node(node) + { + } + + WebString eventType; + bool useCapture; + EventListenerWrapper* eventListenerWrapper; + Node* node; + }; + +private: + WebDOMEventListener* m_webDOMEventListener; + + // We keep a list of the wrapper for the WebKit EventListener, it is needed + // to implement WebNode::removeEventListener(). + Vector<ListenerInfo> m_listenerWrappers; +}; + +} // namespace WebKit + +#endif diff --git a/WebKit/chromium/src/WebDOMMouseEvent.cpp b/WebKit/chromium/src/WebDOMMouseEvent.cpp new file mode 100644 index 0000000..bfeae37 --- /dev/null +++ b/WebKit/chromium/src/WebDOMMouseEvent.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebDOMMouseEvent.h" + +#include "MouseEvent.h" + +using namespace WebCore; + +namespace WebKit { + +int WebDOMMouseEvent::screenX() const +{ + return constUnwrap<MouseEvent>()->screenX(); +} + +int WebDOMMouseEvent::screenY() const +{ + return constUnwrap<MouseEvent>()->screenY(); +} + +int WebDOMMouseEvent::clientX() const +{ + return constUnwrap<MouseEvent>()->clientX(); +} + +int WebDOMMouseEvent::clientY() const +{ + return constUnwrap<MouseEvent>()->clientY(); +} + +int WebDOMMouseEvent::layerX() const +{ + return constUnwrap<MouseEvent>()->layerX(); +} + +int WebDOMMouseEvent::layerY() const +{ + return constUnwrap<MouseEvent>()->layerY(); +} + +int WebDOMMouseEvent::offsetX() const +{ + return constUnwrap<MouseEvent>()->offsetX(); +} + +int WebDOMMouseEvent::offsetY() const +{ + return constUnwrap<MouseEvent>()->offsetY(); +} + +int WebDOMMouseEvent::pageX() const +{ + return constUnwrap<MouseEvent>()->pageX(); +} + +int WebDOMMouseEvent::pageY() const +{ + return constUnwrap<MouseEvent>()->pageY(); +} + +int WebDOMMouseEvent::x() const +{ + return constUnwrap<MouseEvent>()->x(); +} + +int WebDOMMouseEvent::y() const +{ + return constUnwrap<MouseEvent>()->y(); +} + +int WebDOMMouseEvent::button() const +{ + return constUnwrap<MouseEvent>()->button(); +} + +bool WebDOMMouseEvent::buttonDown() const +{ + return constUnwrap<MouseEvent>()->buttonDown(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebDOMMutationEvent.cpp b/WebKit/chromium/src/WebDOMMutationEvent.cpp new file mode 100644 index 0000000..8a6e592 --- /dev/null +++ b/WebKit/chromium/src/WebDOMMutationEvent.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebDOMMutationEvent.h" + +#include "MutationEvent.h" + +using namespace WebCore; + +namespace WebKit { + +WebNode WebDOMMutationEvent::relatedNode() const +{ + return WebNode(constUnwrap<MutationEvent>()->relatedNode()); +} + +WebString WebDOMMutationEvent::prevValue() const +{ + return WebString(constUnwrap<MutationEvent>()->prevValue()); +} + +WebString WebDOMMutationEvent::newValue() const +{ + return WebString(constUnwrap<MutationEvent>()->newValue()); +} + +WebString WebDOMMutationEvent::attrName() const +{ + return WebString(constUnwrap<MutationEvent>()->attrName()); +} + +WebDOMMutationEvent::AttrChangeType WebDOMMutationEvent::attrChange() const +{ + return static_cast<AttrChangeType>(constUnwrap<MutationEvent>()->attrChange()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebDOMStringList.cpp b/WebKit/chromium/src/WebDOMStringList.cpp new file mode 100644 index 0000000..dc82331 --- /dev/null +++ b/WebKit/chromium/src/WebDOMStringList.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebDOMStringList.h" + +#include "DOMStringList.h" +#include "WebString.h" + +using namespace WebCore; + +namespace WebKit { + +WebDOMStringList::WebDOMStringList() +{ + m_private = WebCore::DOMStringList::create(); +} + +void WebDOMStringList::reset() +{ + m_private.reset(); +} + +void WebDOMStringList::assign(const WebDOMStringList& other) +{ + m_private = other.m_private; +} + +void WebDOMStringList::append(const WebString& string) +{ + m_private->append(string); +} + +unsigned WebDOMStringList::length() const +{ + if (m_private.isNull()) + return 0; + return m_private->length(); +} + +WebString WebDOMStringList::item(unsigned index) const +{ + return m_private->item(index); +} + +WebDOMStringList::WebDOMStringList(const WTF::PassRefPtr<WebCore::DOMStringList>& item) + : m_private(item) +{ +} + +WebDOMStringList& WebDOMStringList::operator=(const WTF::PassRefPtr<WebCore::DOMStringList>& item) +{ + m_private = item; + return *this; +} + +WebDOMStringList::operator WTF::PassRefPtr<WebCore::DOMStringList>() const +{ + return m_private.get(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebDataSourceImpl.cpp b/WebKit/chromium/src/WebDataSourceImpl.cpp index 5a315cf..65147fa 100644 --- a/WebKit/chromium/src/WebDataSourceImpl.cpp +++ b/WebKit/chromium/src/WebDataSourceImpl.cpp @@ -96,7 +96,7 @@ double WebDataSourceImpl::triggeringEventTime() const return 0.0; // DOMTimeStamp uses units of milliseconds. - return triggeringAction().event()->timeStamp() / 1000.0; + return convertDOMTimeStampToSeconds(triggeringAction().event()->timeStamp()); } WebDataSource::ExtraData* WebDataSourceImpl::extraData() const @@ -109,7 +109,8 @@ void WebDataSourceImpl::setExtraData(ExtraData* extraData) m_extraData.set(extraData); } -WebApplicationCacheHost* WebDataSourceImpl::applicationCacheHost() { +WebApplicationCacheHost* WebDataSourceImpl::applicationCacheHost() +{ #if ENABLE(OFFLINE_WEB_APPLICATIONS) return ApplicationCacheHostInternal::toWebApplicationCacheHost(DocumentLoader::applicationCacheHost()); #else @@ -117,6 +118,11 @@ WebApplicationCacheHost* WebDataSourceImpl::applicationCacheHost() { #endif } +void WebDataSourceImpl::setDeferMainResourceDataLoad(bool defer) +{ + DocumentLoader::setDeferMainResourceDataLoad(defer); +} + WebNavigationType WebDataSourceImpl::toWebNavigationType(NavigationType type) { switch (type) { @@ -156,7 +162,7 @@ void WebDataSourceImpl::setNextPluginLoadObserver(PassOwnPtr<WebPluginLoadObserv { // This call should always be followed up with the creation of a // WebDataSourceImpl, so we should never leak this object. - m_nextPluginLoadObserver = observer.release(); + m_nextPluginLoadObserver = observer.leakPtr(); } WebDataSourceImpl::WebDataSourceImpl(const ResourceRequest& request, const SubstituteData& data) diff --git a/WebKit/chromium/src/WebDataSourceImpl.h b/WebKit/chromium/src/WebDataSourceImpl.h index f868e95..05329ff 100644 --- a/WebKit/chromium/src/WebDataSourceImpl.h +++ b/WebKit/chromium/src/WebDataSourceImpl.h @@ -31,17 +31,12 @@ #ifndef WebDataSourceImpl_h #define WebDataSourceImpl_h -// FIXME: This relative path is a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebDataSource.h" - #include "DocumentLoader.h" #include "KURL.h" - +#include "WebDataSource.h" #include "WebPluginLoadObserver.h" #include "WrappedResourceRequest.h" #include "WrappedResourceResponse.h" - #include <wtf/OwnPtr.h> #include <wtf/PassOwnPtr.h> #include <wtf/Vector.h> @@ -73,6 +68,7 @@ public: virtual ExtraData* extraData() const; virtual void setExtraData(ExtraData*); virtual WebApplicationCacheHost* applicationCacheHost(); + virtual void setDeferMainResourceDataLoad(bool); static WebNavigationType toWebNavigationType(WebCore::NavigationType type); diff --git a/WebKit/chromium/src/WebDatabase.cpp b/WebKit/chromium/src/WebDatabase.cpp index 50b9220..561d7c4 100644 --- a/WebKit/chromium/src/WebDatabase.cpp +++ b/WebKit/chromium/src/WebDatabase.cpp @@ -31,12 +31,8 @@ #include "config.h" #include "WebDatabase.h" -#include "Database.h" -#include "DatabaseTask.h" -#include "DatabaseThread.h" +#include "AbstractDatabase.h" #include "DatabaseTracker.h" -#include "Document.h" -#include "KURL.h" #include "QuotaTracker.h" #include "SecurityOrigin.h" #include "WebDatabaseObserver.h" @@ -44,50 +40,46 @@ #include <wtf/PassRefPtr.h> #include <wtf/RefPtr.h> +#if !ENABLE(DATABASE) +namespace WebCore { +class AbstractDatabase { +public: + String stringIdentifier() const { return String(); } + String displayName() const { return String(); } + unsigned long long estimatedSize() const { return 0; } + SecurityOrigin* securityOrigin() const { return 0; } +}; +} +#endif // !ENABLE(DATABASE) + using namespace WebCore; namespace WebKit { static WebDatabaseObserver* databaseObserver = 0; -class WebDatabasePrivate : public Database { -}; - -void WebDatabase::reset() -{ - assign(0); -} - -void WebDatabase::assign(const WebDatabase& other) -{ - WebDatabasePrivate* d = const_cast<WebDatabasePrivate*>(other.m_private); - if (d) - d->ref(); - assign(d); -} - WebString WebDatabase::name() const { - ASSERT(m_private); - return m_private->stringIdentifier(); + ASSERT(m_database); + return m_database->stringIdentifier(); } WebString WebDatabase::displayName() const { - ASSERT(m_private); - return m_private->displayName(); + ASSERT(m_database); + return m_database->displayName(); } unsigned long WebDatabase::estimatedSize() const { - ASSERT(m_private); - return m_private->estimatedSize(); + ASSERT(m_database); + return m_database->estimatedSize(); } WebSecurityOrigin WebDatabase::securityOrigin() const { - ASSERT(m_private); - return WebSecurityOrigin(m_private->securityOrigin()); + ASSERT(m_database); + return WebSecurityOrigin(m_database->securityOrigin()); } void WebDatabase::setObserver(WebDatabaseObserver* observer) @@ -104,48 +96,26 @@ void WebDatabase::updateDatabaseSize( const WebString& originIdentifier, const WebString& databaseName, unsigned long long databaseSize, unsigned long long spaceAvailable) { +#if ENABLE(DATABASE) WebCore::QuotaTracker::instance().updateDatabaseSizeAndSpaceAvailableToOrigin( originIdentifier, databaseName, databaseSize, spaceAvailable); +#endif // ENABLE(DATABASE) } void WebDatabase::closeDatabaseImmediately(const WebString& originIdentifier, const WebString& databaseName) { - HashSet<RefPtr<Database> > databaseHandles; - PassRefPtr<SecurityOrigin> originPrp(*WebSecurityOrigin::createFromDatabaseIdentifier(originIdentifier)); - RefPtr<SecurityOrigin> origin = originPrp; +#if ENABLE(DATABASE) + HashSet<RefPtr<AbstractDatabase> > databaseHandles; + RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier); DatabaseTracker::tracker().getOpenDatabases(origin.get(), databaseName, &databaseHandles); - for (HashSet<RefPtr<Database> >::iterator it = databaseHandles.begin(); it != databaseHandles.end(); ++it) { - Database* database = it->get(); - DatabaseThread* databaseThread = database->scriptExecutionContext()->databaseThread(); - if (databaseThread && !databaseThread->terminationRequested()) { - database->stop(); - databaseThread->scheduleTask(DatabaseCloseTask::create(database, 0)); - } - } -} - -WebDatabase::WebDatabase(const WTF::PassRefPtr<Database>& database) - : m_private(static_cast<WebDatabasePrivate*>(database.releaseRef())) -{ -} - -WebDatabase& WebDatabase::operator=(const WTF::PassRefPtr<Database>& database) -{ - assign(static_cast<WebDatabasePrivate*>(database.releaseRef())); - return *this; -} - -WebDatabase::operator WTF::PassRefPtr<Database>() const -{ - return PassRefPtr<Database>(const_cast<WebDatabasePrivate*>(m_private)); + for (HashSet<RefPtr<AbstractDatabase> >::iterator it = databaseHandles.begin(); it != databaseHandles.end(); ++it) + it->get()->closeImmediately(); +#endif // ENABLE(DATABASE) } -void WebDatabase::assign(WebDatabasePrivate* d) +WebDatabase::WebDatabase(const AbstractDatabase* database) + : m_database(database) { - // d is already ref'd for us by the caller - if (m_private) - m_private->deref(); - m_private = d; } } // namespace WebKit diff --git a/WebKit/chromium/src/WebDevToolsAgentImpl.cpp b/WebKit/chromium/src/WebDevToolsAgentImpl.cpp index 9ce35b4..880adb4 100644 --- a/WebKit/chromium/src/WebDevToolsAgentImpl.cpp +++ b/WebKit/chromium/src/WebDevToolsAgentImpl.cpp @@ -31,105 +31,143 @@ #include "config.h" #include "WebDevToolsAgentImpl.h" -#include "BoundObject.h" #include "DebuggerAgentImpl.h" #include "DebuggerAgentManager.h" -#include "Document.h" -#include "EventListener.h" #include "InjectedScriptHost.h" -#include "InspectorBackend.h" +#include "InspectorBackendDispatcher.h" #include "InspectorController.h" -#include "InspectorFrontend.h" -#include "InspectorResource.h" -#include "Node.h" #include "Page.h" +#include "PageGroup.h" #include "PlatformString.h" -#include "ProfilerAgentImpl.h" #include "ResourceError.h" #include "ResourceRequest.h" #include "ResourceResponse.h" -#include "ScriptObject.h" -#include "ScriptState.h" -#include "ScriptValue.h" +#include "ScriptDebugServer.h" #include "V8Binding.h" -#include "V8InspectorBackend.h" #include "V8Proxy.h" #include "V8Utilities.h" #include "WebDataSource.h" #include "WebDevToolsAgentClient.h" -#include "WebDevToolsMessageData.h" #include "WebFrameImpl.h" +#include "WebRect.h" #include "WebString.h" #include "WebURL.h" #include "WebURLError.h" #include "WebURLRequest.h" #include "WebURLResponse.h" +#include "WebViewClient.h" #include "WebViewImpl.h" +#include <wtf/CurrentTime.h> #include <wtf/Noncopyable.h> #include <wtf/OwnPtr.h> -using WebCore::Document; using WebCore::DocumentLoader; using WebCore::FrameLoader; using WebCore::InjectedScriptHost; -using WebCore::InspectorBackend; +using WebCore::InspectorArray; +using WebCore::InspectorBackendDispatcher; using WebCore::InspectorController; -using WebCore::InspectorFrontend; -using WebCore::InspectorResource; using WebCore::Node; using WebCore::Page; using WebCore::ResourceError; using WebCore::ResourceRequest; using WebCore::ResourceResponse; -using WebCore::SafeAllocation; -using WebCore::ScriptObject; -using WebCore::ScriptState; -using WebCore::ScriptValue; -using WebCore::String; -using WebCore::V8ClassIndex; +using WTF::String; using WebCore::V8DOMWrapper; -using WebCore::V8InspectorBackend; using WebCore::V8Proxy; namespace WebKit { namespace { -void InspectorBackendWeakReferenceCallback(v8::Persistent<v8::Value> object, void* parameter) -{ - InspectorBackend* backend = static_cast<InspectorBackend*>(parameter); - backend->deref(); - object.Dispose(); -} +static const char kApuAgentFeatureName[] = "apu-agent"; +static const char kFrontendConnectedFeatureName[] = "frontend-connected"; +static const char kInspectorStateFeatureName[] = "inspector-state"; -void SetApuAgentEnabledInUtilityContext(v8::Handle<v8::Context> context, bool enabled) -{ - v8::HandleScope handleScope; - v8::Context::Scope contextScope(context); - v8::Handle<v8::Object> dispatcher = v8::Local<v8::Object>::Cast( - context->Global()->Get(v8::String::New("ApuAgentDispatcher"))); - if (dispatcher.IsEmpty()) - return; - dispatcher->Set(v8::String::New("enabled"), v8::Boolean::New(enabled)); -} +class ClientMessageLoopAdapter : public WebCore::ScriptDebugServer::ClientMessageLoop { +public: + static void ensureClientMessageLoopCreated(WebDevToolsAgentClient* client) + { + if (s_instance) + return; + s_instance = new ClientMessageLoopAdapter(client->createClientMessageLoop()); + WebCore::ScriptDebugServer::shared().setClientMessageLoop(s_instance); + } -// TODO(pfeldman): Make this public in WebDevToolsAgent API. -static const char kApuAgentFeatureName[] = "apu-agent"; + static void inspectedViewClosed(WebViewImpl* view) + { + if (s_instance) + s_instance->m_frozenViews.remove(view); + } + + static void didNavigate() + { + // Release render thread if necessary. + if (s_instance && s_instance->m_running) + WebCore::ScriptDebugServer::shared().continueProgram(); + } -// Keep these in sync with the ones in inject_dispatch.js. -static const char kTimelineFeatureName[] = "timeline-profiler"; -static const char kResourceTrackingFeatureName[] = "resource-tracking"; +private: + ClientMessageLoopAdapter(PassOwnPtr<WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop> messageLoop) + : m_running(false) + , m_messageLoop(messageLoop) { } -class IORPCDelegate : public DevToolsRPC::Delegate, public Noncopyable { -public: - IORPCDelegate() { } - virtual ~IORPCDelegate() { } - virtual void sendRpcMessage(const WebDevToolsMessageData& data) + + virtual void run(Page* page) { - WebDevToolsAgentClient::sendMessageToFrontendOnIOThread(data); + if (m_running) + return; + m_running = true; + + Vector<WebViewImpl*> views; + + // 1. Disable input events. + HashSet<Page*>::const_iterator end = page->group().pages().end(); + for (HashSet<Page*>::const_iterator it = page->group().pages().begin(); it != end; ++it) { + WebViewImpl* view = WebViewImpl::fromPage(*it); + m_frozenViews.add(view); + views.append(view); + view->setIgnoreInputEvents(true); + } + + // 2. Disable active objects + WebView::willEnterModalLoop(); + + // 3. Process messages until quitNow is called. + m_messageLoop->run(); + + // 4. Resume active objects + WebView::didExitModalLoop(); + + // 5. Resume input events. + for (Vector<WebViewImpl*>::iterator it = views.begin(); it != views.end(); ++it) { + if (m_frozenViews.contains(*it)) { + // The view was not closed during the dispatch. + (*it)->setIgnoreInputEvents(false); + } + } + + // 6. All views have been resumed, clear the set. + m_frozenViews.clear(); + + m_running = false; } + + virtual void quitNow() + { + m_messageLoop->quitNow(); + } + + bool m_running; + OwnPtr<WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop> m_messageLoop; + typedef HashSet<WebViewImpl*> FrozenViewsSet; + FrozenViewsSet m_frozenViews; + static ClientMessageLoopAdapter* s_instance; + }; +ClientMessageLoopAdapter* ClientMessageLoopAdapter::s_instance = 0; + } // namespace WebDevToolsAgentImpl::WebDevToolsAgentImpl( @@ -139,142 +177,65 @@ WebDevToolsAgentImpl::WebDevToolsAgentImpl( , m_client(client) , m_webViewImpl(webViewImpl) , m_apuAgentEnabled(false) - , m_resourceTrackingWasEnabled(false) , m_attached(false) { - m_debuggerAgentDelegateStub.set(new DebuggerAgentDelegateStub(this)); - m_toolsAgentDelegateStub.set(new ToolsAgentDelegateStub(this)); - m_apuAgentDelegateStub.set(new ApuAgentDelegateStub(this)); + DebuggerAgentManager::setExposeV8DebuggerProtocol( + client->exposeV8DebuggerProtocol()); } WebDevToolsAgentImpl::~WebDevToolsAgentImpl() { DebuggerAgentManager::onWebViewClosed(m_webViewImpl); - disposeUtilityContext(); -} - -void WebDevToolsAgentImpl::disposeUtilityContext() -{ - if (!m_utilityContext.IsEmpty()) { - m_utilityContext.Dispose(); - m_utilityContext.Clear(); - } -} - -void WebDevToolsAgentImpl::unhideResourcesPanelIfNecessary() -{ - InspectorController* ic = m_webViewImpl->page()->inspectorController(); - ic->ensureResourceTrackingSettingsLoaded(); - String command = String::format("[\"setResourcesPanelEnabled\", %s]", - ic->resourceTrackingEnabled() ? "true" : "false"); - m_toolsAgentDelegateStub->dispatchOnClient(command); + ClientMessageLoopAdapter::inspectedViewClosed(m_webViewImpl); } void WebDevToolsAgentImpl::attach() { if (m_attached) return; - m_debuggerAgentImpl.set( - new DebuggerAgentImpl(m_webViewImpl, - m_debuggerAgentDelegateStub.get(), - this)); - resetInspectorFrontendProxy(); - unhideResourcesPanelIfNecessary(); - // Allow controller to send messages to the frontend. - InspectorController* ic = inspectorController(); - { // TODO(yurys): the source should have already been pushed by the frontend. - v8::HandleScope scope; - v8::Context::Scope contextScope(m_utilityContext); - v8::Handle<v8::Value> constructorValue = m_utilityContext->Global()->Get( - v8::String::New("injectedScriptConstructor")); - if (constructorValue->IsFunction()) { - String source = WebCore::toWebCoreString(constructorValue); - ic->injectedScriptHost()->setInjectedScriptSource("(" + source + ")"); - } - } + if (!m_client->exposeV8DebuggerProtocol()) + ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client); - ic->setWindowVisible(true, false); + m_debuggerAgentImpl.set( + new DebuggerAgentImpl(m_webViewImpl, this, m_client)); + WebCString debuggerScriptJs = m_client->debuggerScriptSource(); + WebCore::ScriptDebugServer::shared().setDebuggerScriptSource( + WTF::String(debuggerScriptJs.data(), debuggerScriptJs.length())); m_attached = true; } void WebDevToolsAgentImpl::detach() { // Prevent controller from sending messages to the frontend. - InspectorController* ic = m_webViewImpl->page()->inspectorController(); + InspectorController* ic = inspectorController(); + ic->disconnectFrontend(); ic->hideHighlight(); ic->close(); - disposeUtilityContext(); m_debuggerAgentImpl.set(0); m_attached = false; m_apuAgentEnabled = false; } -void WebDevToolsAgentImpl::didNavigate() +void WebDevToolsAgentImpl::frontendLoaded() { - DebuggerAgentManager::onNavigate(); + connectFrontend(false); } -void WebDevToolsAgentImpl::didCommitProvisionalLoad(WebFrameImpl* webframe, bool isNewNavigation) +void WebDevToolsAgentImpl::didNavigate() { - if (!m_attached) - return; - WebDataSource* ds = webframe->dataSource(); - const WebURLRequest& request = ds->request(); - WebURL url = ds->hasUnreachableURL() ? - ds->unreachableURL() : - request.url(); - if (!webframe->parent()) { - resetInspectorFrontendProxy(); - m_toolsAgentDelegateStub->frameNavigate(WebCore::KURL(url).string()); - SetApuAgentEnabledInUtilityContext(m_utilityContext, m_apuAgentEnabled); - unhideResourcesPanelIfNecessary(); - } + ClientMessageLoopAdapter::didNavigate(); + DebuggerAgentManager::onNavigate(); } void WebDevToolsAgentImpl::didClearWindowObject(WebFrameImpl* webframe) { DebuggerAgentManager::setHostId(webframe, m_hostId); - if (m_attached) { - // Push context id into the client if it is already attached. - m_debuggerAgentDelegateStub->setContextId(m_hostId); - } } -void WebDevToolsAgentImpl::forceRepaint() +void WebDevToolsAgentImpl::dispatchOnInspectorBackend(const WebString& message) { - m_client->forceRepaint(); -} - -void WebDevToolsAgentImpl::dispatchOnInspectorController(int callId, const String& functionName, const String& jsonArgs) -{ - String result; - String exception; - result = m_debuggerAgentImpl->executeUtilityFunction(m_utilityContext, callId, - "InspectorControllerDispatcher", functionName, jsonArgs, false /* is sync */, &exception); - m_toolsAgentDelegateStub->didDispatchOn(callId, result, exception); -} - -void WebDevToolsAgentImpl::dispatchOnInjectedScript(int callId, int injectedScriptId, const String& functionName, const String& jsonArgs, bool async) -{ - inspectorController()->inspectorBackend()->dispatchOnInjectedScript( - callId, - injectedScriptId, - functionName, - jsonArgs, - async); -} - -void WebDevToolsAgentImpl::dispatchMessageFromFrontend(const WebDevToolsMessageData& data) -{ - if (ToolsAgentDispatch::dispatch(this, data)) - return; - - if (!m_attached) - return; - - if (m_debuggerAgentImpl.get() && DebuggerAgentDispatch::dispatch(m_debuggerAgentImpl.get(), data)) - return; + inspectorController()->inspectorBackendDispatcher()->dispatch(message); } void WebDevToolsAgentImpl::inspectElementAt(const WebPoint& point) @@ -282,188 +243,47 @@ void WebDevToolsAgentImpl::inspectElementAt(const WebPoint& point) m_webViewImpl->inspectElementAt(point); } -void WebDevToolsAgentImpl::setRuntimeFeatureEnabled(const WebString& feature, bool enabled) -{ - if (feature == kApuAgentFeatureName) - setApuAgentEnabled(enabled); - else if (feature == kTimelineFeatureName) - setTimelineProfilingEnabled(enabled); - else if (feature == kResourceTrackingFeatureName) { - InspectorController* ic = m_webViewImpl->page()->inspectorController(); - if (enabled) - ic->enableResourceTracking(false /* not sticky */, false /* no reload */); - else - ic->disableResourceTracking(false /* not sticky */); - } -} - -void WebDevToolsAgentImpl::sendRpcMessage(const WebDevToolsMessageData& data) -{ - m_client->sendMessageToFrontend(data); -} - -void WebDevToolsAgentImpl::compileUtilityScripts() -{ - v8::HandleScope handleScope; - v8::Context::Scope contextScope(m_utilityContext); - // Inject javascript into the context. - WebCString injectedScriptJs = m_client->injectedScriptSource(); - v8::Script::Compile(v8::String::New( - injectedScriptJs.data(), - injectedScriptJs.length()))->Run(); - WebCString injectDispatchJs = m_client->injectedScriptDispatcherSource(); - v8::Script::Compile(v8::String::New( - injectDispatchJs.data(), - injectDispatchJs.length()))->Run(); -} - -void WebDevToolsAgentImpl::initDevToolsAgentHost() -{ - BoundObject devtoolsAgentHost(m_utilityContext, this, "DevToolsAgentHost"); - devtoolsAgentHost.addProtoFunction( - "dispatch", - WebDevToolsAgentImpl::jsDispatchOnClient); - devtoolsAgentHost.addProtoFunction( - "dispatchToApu", - WebDevToolsAgentImpl::jsDispatchToApu); - devtoolsAgentHost.addProtoFunction( - "evaluateOnSelf", - WebDevToolsAgentImpl::jsEvaluateOnSelf); - devtoolsAgentHost.addProtoFunction( - "runtimeFeatureStateChanged", - WebDevToolsAgentImpl::jsOnRuntimeFeatureStateChanged); - devtoolsAgentHost.build(); - - v8::HandleScope scope; - v8::Context::Scope utilityScope(m_utilityContext); - // Call custom code to create inspector backend wrapper in the utility context - // instead of calling V8DOMWrapper::convertToV8Object that would create the - // wrapper in the Page main frame context. - v8::Handle<v8::Object> backendWrapper = createInspectorBackendV8Wrapper(); - if (backendWrapper.IsEmpty()) - return; - m_utilityContext->Global()->Set(v8::String::New("InspectorBackend"), backendWrapper); -} - -v8::Local<v8::Object> WebDevToolsAgentImpl::createInspectorBackendV8Wrapper() +void WebDevToolsAgentImpl::setRuntimeProperty(const WebString& name, const WebString& value) { - V8ClassIndex::V8WrapperType descriptorType = V8ClassIndex::INSPECTORBACKEND; - v8::Handle<v8::Function> function = V8InspectorBackend::GetTemplate()->GetFunction(); - if (function.IsEmpty()) { - // Return if allocation failed. - return v8::Local<v8::Object>(); - } - v8::Local<v8::Object> instance = SafeAllocation::newInstance(function); - if (instance.IsEmpty()) { - // Avoid setting the wrapper if allocation failed. - return v8::Local<v8::Object>(); + if (name == kApuAgentFeatureName) + setApuAgentEnabled(value == "true"); + else if (name == kInspectorStateFeatureName) { + InspectorController* ic = inspectorController(); + ic->restoreInspectorStateFromCookie(value); + } else if (name == kFrontendConnectedFeatureName && !inspectorController()->hasFrontend()) { + inspectorController()->injectedScriptHost()->setInjectedScriptSource(value); + connectFrontend(true); } - InspectorBackend* backend = m_webViewImpl->page()->inspectorController()->inspectorBackend(); - V8DOMWrapper::setDOMWrapper(instance, V8ClassIndex::ToInt(descriptorType), backend); - // Create a weak reference to the v8 wrapper of InspectorBackend to deref - // InspectorBackend when the wrapper is garbage collected. - backend->ref(); - v8::Persistent<v8::Object> weakHandle = v8::Persistent<v8::Object>::New(instance); - weakHandle.MakeWeak(backend, &InspectorBackendWeakReferenceCallback); - return instance; -} - -void WebDevToolsAgentImpl::resetInspectorFrontendProxy() -{ - disposeUtilityContext(); - m_debuggerAgentImpl->createUtilityContext(m_webViewImpl->page()->mainFrame(), &m_utilityContext); - compileUtilityScripts(); - initDevToolsAgentHost(); - - v8::HandleScope scope; - v8::Context::Scope contextScope(m_utilityContext); - ScriptState* state = ScriptState::forContext( - v8::Local<v8::Context>::New(m_utilityContext)); - InspectorController* ic = inspectorController(); - ic->setFrontendProxyObject(state, ScriptObject(state, m_utilityContext->Global())); } void WebDevToolsAgentImpl::setApuAgentEnabled(bool enabled) { m_apuAgentEnabled = enabled; - SetApuAgentEnabledInUtilityContext(m_utilityContext, enabled); - InspectorController* ic = m_webViewImpl->page()->inspectorController(); + InspectorController* ic = inspectorController(); if (enabled) { - m_resourceTrackingWasEnabled = ic->resourceTrackingEnabled(); + if (!ic->hasFrontend()) + connectFrontend(true); + ic->startTimelineProfiler(); - if (!m_resourceTrackingWasEnabled) { - // TODO(knorton): Introduce some kind of agents dependency here so that - // user could turn off resource tracking while apu agent is on. - ic->enableResourceTracking(false, false); - } m_debuggerAgentImpl->setAutoContinueOnException(true); - } else { + } else ic->stopTimelineProfiler(); - if (!m_resourceTrackingWasEnabled) - ic->disableResourceTracking(false); - m_resourceTrackingWasEnabled = false; - } - m_client->runtimeFeatureStateChanged( - kApuAgentFeatureName, - enabled); -} - -// static -v8::Handle<v8::Value> WebDevToolsAgentImpl::jsDispatchOnClient(const v8::Arguments& args) -{ - v8::TryCatch exceptionCatcher; - String message = WebCore::toWebCoreStringWithNullCheck(args[0]); - if (message.isEmpty() || exceptionCatcher.HasCaught()) - return v8::Undefined(); - WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>(v8::External::Cast(*args.Data())->Value()); - agent->m_toolsAgentDelegateStub->dispatchOnClient(message); - return v8::Undefined(); -} - -// static -v8::Handle<v8::Value> WebDevToolsAgentImpl::jsDispatchToApu(const v8::Arguments& args) -{ - v8::TryCatch exceptionCatcher; - String message = WebCore::toWebCoreStringWithNullCheck(args[0]); - if (message.isEmpty() || exceptionCatcher.HasCaught()) - return v8::Undefined(); - WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>( - v8::External::Cast(*args.Data())->Value()); - agent->m_apuAgentDelegateStub->dispatchToApu(message); - return v8::Undefined(); -} -// static -v8::Handle<v8::Value> WebDevToolsAgentImpl::jsEvaluateOnSelf(const v8::Arguments& args) -{ - String code; - { - v8::TryCatch exceptionCatcher; - code = WebCore::toWebCoreStringWithNullCheck(args[0]); - if (code.isEmpty() || exceptionCatcher.HasCaught()) - return v8::Undefined(); - } - WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>(v8::External::Cast(*args.Data())->Value()); - v8::Context::Scope(agent->m_utilityContext); - V8Proxy* proxy = V8Proxy::retrieve(agent->m_webViewImpl->page()->mainFrame()); - v8::Local<v8::Value> result = proxy->runScript(v8::Script::Compile(v8::String::New(code.utf8().data())), true); - return result; + m_client->runtimePropertyChanged( + kApuAgentFeatureName, + enabled ? String("true") : String("false")); } -// static -v8::Handle<v8::Value> WebDevToolsAgentImpl::jsOnRuntimeFeatureStateChanged(const v8::Arguments& args) +void WebDevToolsAgentImpl::connectFrontend(bool afterNavigation) { - v8::TryCatch exceptionCatcher; - String feature = WebCore::toWebCoreStringWithNullCheck(args[0]); - bool enabled = args[1]->ToBoolean()->Value(); - if (feature.isEmpty() || exceptionCatcher.HasCaught()) - return v8::Undefined(); - WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>(v8::External::Cast(*args.Data())->Value()); - agent->m_client->runtimeFeatureStateChanged(feature, enabled); - return v8::Undefined(); + if (afterNavigation) + inspectorController()->reuseFrontend(); + else + inspectorController()->connectFrontend(); + // We know that by this time injected script has already been pushed to the backend. + m_client->runtimePropertyChanged(kFrontendConnectedFeatureName, inspectorController()->injectedScriptHost()->injectedScriptSource()); } - WebCore::InspectorController* WebDevToolsAgentImpl::inspectorController() { if (Page* page = m_webViewImpl->page()) @@ -486,10 +306,13 @@ void WebDevToolsAgentImpl::identifierForInitialRequest( } } -void WebDevToolsAgentImpl::willSendRequest(unsigned long resourceId, const WebURLRequest& request) +void WebDevToolsAgentImpl::willSendRequest(unsigned long resourceId, WebURLRequest& request) { - if (InspectorController* ic = inspectorController()) - ic->willSendRequest(resourceId, request.toResourceRequest(), ResourceResponse()); + if (InspectorController* ic = inspectorController()) { + ic->willSendRequest(resourceId, request.toMutableResourceRequest(), ResourceResponse()); + if (ic->hasFrontend() && request.reportLoadTiming()) + request.setReportRawHeaders(true); + } } void WebDevToolsAgentImpl::didReceiveData(unsigned long resourceId, int length) @@ -501,13 +324,13 @@ void WebDevToolsAgentImpl::didReceiveData(unsigned long resourceId, int length) void WebDevToolsAgentImpl::didReceiveResponse(unsigned long resourceId, const WebURLResponse& response) { if (InspectorController* ic = inspectorController()) - ic->didReceiveResponse(resourceId, response.toResourceResponse()); + ic->didReceiveResponse(resourceId, 0, response.toResourceResponse()); } void WebDevToolsAgentImpl::didFinishLoading(unsigned long resourceId) { if (InspectorController* ic = inspectorController()) - ic->didFinishLoading(resourceId); + ic->didFinishLoading(resourceId, 0); } void WebDevToolsAgentImpl::didFailLoading(unsigned long resourceId, const WebURLError& error) @@ -517,6 +340,67 @@ void WebDevToolsAgentImpl::didFailLoading(unsigned long resourceId, const WebURL ic->didFailLoading(resourceId, resourceError); } +void WebDevToolsAgentImpl::inspectorDestroyed() +{ + // Our lifetime is bound to the WebViewImpl. +} + +void WebDevToolsAgentImpl::openInspectorFrontend(InspectorController*) +{ +} + +void WebDevToolsAgentImpl::highlight(Node* node) +{ + // InspectorController does the actuall tracking of the highlighted node + // and the drawing of the highlight. Here we just make sure to invalidate + // the rects of the old and new nodes. + hideHighlight(); +} + +void WebDevToolsAgentImpl::hideHighlight() +{ + // FIXME: able to invalidate a smaller rect. + // FIXME: Is it important to just invalidate the rect of the node region + // given that this is not on a critical codepath? In order to do so, we'd + // have to take scrolling into account. + const WebSize& size = m_webViewImpl->size(); + WebRect damagedRect(0, 0, size.width, size.height); + if (m_webViewImpl->client()) + m_webViewImpl->client()->didInvalidateRect(damagedRect); +} + +void WebDevToolsAgentImpl::populateSetting(const String& key, String* value) +{ + WebString string; + m_webViewImpl->inspectorSetting(key, &string); + *value = string; +} + +void WebDevToolsAgentImpl::storeSetting(const String& key, const String& value) +{ + m_webViewImpl->setInspectorSetting(key, value); +} + +bool WebDevToolsAgentImpl::sendMessageToFrontend(const WTF::String& message) +{ + WebDevToolsAgentImpl* devToolsAgent = static_cast<WebDevToolsAgentImpl*>(m_webViewImpl->devToolsAgent()); + if (!devToolsAgent) + return false; + + if (devToolsAgent->m_apuAgentEnabled) { + m_client->sendDispatchToAPU(message); + return true; + } + + m_client->sendMessageToInspectorFrontend(message); + return true; +} + +void WebDevToolsAgentImpl::updateInspectorStateCookie(const WTF::String& state) +{ + m_client->runtimePropertyChanged(kInspectorStateFeatureName, state); +} + void WebDevToolsAgentImpl::evaluateInWebInspector(long callId, const WebString& script) { InspectorController* ic = inspectorController(); @@ -532,11 +416,6 @@ void WebDevToolsAgentImpl::setTimelineProfilingEnabled(bool enabled) ic->stopTimelineProfiler(); } -WebDevToolsAgent* WebDevToolsAgent::create(WebView* webview, WebDevToolsAgentClient* client) -{ - return new WebDevToolsAgentImpl(static_cast<WebViewImpl*>(webview), client); -} - void WebDevToolsAgent::executeDebuggerCommand(const WebString& command, int callerId) { DebuggerAgentManager::executeDebuggerCommand(command, callerId); @@ -547,17 +426,46 @@ void WebDevToolsAgent::debuggerPauseScript() DebuggerAgentManager::pauseScript(); } -void WebDevToolsAgent::setMessageLoopDispatchHandler(MessageLoopDispatchHandler handler) +void WebDevToolsAgent::interruptAndDispatch(MessageDescriptor* d) { - DebuggerAgentManager::setMessageLoopDispatchHandler(handler); + class DebuggerTask : public WebCore::ScriptDebugServer::Task { + public: + DebuggerTask(WebDevToolsAgent::MessageDescriptor* descriptor) : m_descriptor(descriptor) { } + virtual ~DebuggerTask() { } + virtual void run() + { + if (WebDevToolsAgent* webagent = m_descriptor->agent()) + webagent->dispatchOnInspectorBackend(m_descriptor->message()); + } + private: + OwnPtr<WebDevToolsAgent::MessageDescriptor> m_descriptor; + }; + WebCore::ScriptDebugServer::interruptAndRun(new DebuggerTask(d)); } -bool WebDevToolsAgent::dispatchMessageFromFrontendOnIOThread(const WebDevToolsMessageData& data) +bool WebDevToolsAgent::shouldInterruptForMessage(const WebString& message) { - IORPCDelegate transport; - ProfilerAgentDelegateStub stub(&transport); - ProfilerAgentImpl agent(&stub); - return ProfilerAgentDispatch::dispatch(&agent, data); + String commandName; + if (!InspectorBackendDispatcher::getCommandName(message, &commandName)) + return false; + return commandName == InspectorBackendDispatcher::pauseCmd + || commandName == InspectorBackendDispatcher::setBreakpointCmd + || commandName == InspectorBackendDispatcher::removeBreakpointCmd + || commandName == InspectorBackendDispatcher::activateBreakpointsCmd + || commandName == InspectorBackendDispatcher::deactivateBreakpointsCmd + || commandName == InspectorBackendDispatcher::startProfilingCmd + || commandName == InspectorBackendDispatcher::stopProfilingCmd + || commandName == InspectorBackendDispatcher::getProfileCmd; +} + +void WebDevToolsAgent::processPendingMessages() +{ + WebCore::ScriptDebugServer::shared().runPendingTasks(); +} + +void WebDevToolsAgent::setMessageLoopDispatchHandler(MessageLoopDispatchHandler handler) +{ + DebuggerAgentManager::setMessageLoopDispatchHandler(handler); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebDevToolsAgentImpl.h b/WebKit/chromium/src/WebDevToolsAgentImpl.h index 1f81c6d..feb4bdd 100644 --- a/WebKit/chromium/src/WebDevToolsAgentImpl.h +++ b/WebKit/chromium/src/WebDevToolsAgentImpl.h @@ -31,24 +31,23 @@ #ifndef WebDevToolsAgentImpl_h #define WebDevToolsAgentImpl_h -#include "APUAgentDelegate.h" -#include "DevToolsRPC.h" -#include "ToolsAgent.h" +#include "InspectorClient.h" + #include "WebDevToolsAgentPrivate.h" #include <v8.h> +#include <wtf/Forward.h> #include <wtf/OwnPtr.h> namespace WebCore { class Document; +class InspectorClient; class InspectorController; class Node; -class String; } namespace WebKit { -class DebuggerAgentDelegateStub; class DebuggerAgentImpl; class WebDevToolsAgentClient; class WebFrame; @@ -61,79 +60,56 @@ struct WebURLError; struct WebDevToolsMessageData; class WebDevToolsAgentImpl : public WebDevToolsAgentPrivate, - public ToolsAgent, - public DevToolsRPC::Delegate { + public WebCore::InspectorClient { public: WebDevToolsAgentImpl(WebViewImpl* webViewImpl, WebDevToolsAgentClient* client); virtual ~WebDevToolsAgentImpl(); - // ToolsAgent implementation. - virtual void dispatchOnInspectorController(int callId, const WebCore::String& functionName, const WebCore::String& jsonArgs); - virtual void dispatchOnInjectedScript(int callId, int injectedScriptId, const WebCore::String& functionName, const WebCore::String& jsonArgs, bool async); - // WebDevToolsAgentPrivate implementation. virtual void didClearWindowObject(WebFrameImpl* frame); - virtual void didCommitProvisionalLoad(WebFrameImpl* frame, bool isNewNavigation); // WebDevToolsAgent implementation. virtual void attach(); virtual void detach(); + virtual void frontendLoaded(); virtual void didNavigate(); - virtual void dispatchMessageFromFrontend(const WebDevToolsMessageData& data); + virtual void dispatchOnInspectorBackend(const WebString& message); virtual void inspectElementAt(const WebPoint& point); virtual void evaluateInWebInspector(long callId, const WebString& script); - virtual void setRuntimeFeatureEnabled(const WebString& feature, bool enabled); + virtual void setRuntimeProperty(const WebString& name, const WebString& value); virtual void setTimelineProfilingEnabled(bool enable); virtual void identifierForInitialRequest(unsigned long, WebFrame*, const WebURLRequest&); - virtual void willSendRequest(unsigned long, const WebURLRequest&); + virtual void willSendRequest(unsigned long, WebURLRequest&); virtual void didReceiveData(unsigned long, int length); virtual void didReceiveResponse(unsigned long, const WebURLResponse&); virtual void didFinishLoading(unsigned long); virtual void didFailLoading(unsigned long, const WebURLError&); - // DevToolsRPC::Delegate implementation. - virtual void sendRpcMessage(const WebDevToolsMessageData& data); - - void forceRepaint(); + // InspectorClient implementation. + virtual void inspectorDestroyed(); + virtual void openInspectorFrontend(WebCore::InspectorController*); + virtual void highlight(WebCore::Node*); + virtual void hideHighlight(); + virtual void populateSetting(const WTF::String& key, WTF::String* value); + virtual void storeSetting(const WTF::String& key, const WTF::String& value); + virtual void updateInspectorStateCookie(const WTF::String&); + virtual bool sendMessageToFrontend(const WTF::String&); int hostId() { return m_hostId; } private: - static v8::Handle<v8::Value> jsDispatchOnClient(const v8::Arguments& args); - static v8::Handle<v8::Value> jsDispatchToApu(const v8::Arguments& args); - static v8::Handle<v8::Value> jsEvaluateOnSelf(const v8::Arguments& args); - static v8::Handle<v8::Value> jsOnRuntimeFeatureStateChanged(const v8::Arguments& args); - - void disposeUtilityContext(); - void unhideResourcesPanelIfNecessary(); - - void compileUtilityScripts(); - void initDevToolsAgentHost(); - void resetInspectorFrontendProxy(); void setApuAgentEnabled(bool enabled); + void connectFrontend(bool afterNavigation); WebCore::InspectorController* inspectorController(); - // Creates InspectorBackend v8 wrapper in the utility context so that it's - // methods prototype is Function.protoype object from the utility context. - // Otherwise some useful methods defined on Function.prototype(such as bind) - // are missing for InspectorController native methods. - v8::Local<v8::Object> createInspectorBackendV8Wrapper(); - int m_hostId; WebDevToolsAgentClient* m_client; WebViewImpl* m_webViewImpl; - OwnPtr<DebuggerAgentDelegateStub> m_debuggerAgentDelegateStub; - OwnPtr<ToolsAgentDelegateStub> m_toolsAgentDelegateStub; OwnPtr<DebuggerAgentImpl> m_debuggerAgentImpl; - OwnPtr<ApuAgentDelegateStub> m_apuAgentDelegateStub; bool m_apuAgentEnabled; - bool m_resourceTrackingWasEnabled; bool m_attached; - // TODO(pfeldman): This should not be needed once GC styles issue is fixed - // for matching rules. - v8::Persistent<v8::Context> m_utilityContext; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebDevToolsAgentPrivate.h b/WebKit/chromium/src/WebDevToolsAgentPrivate.h index 0c1c67e..7038a5e 100644 --- a/WebKit/chromium/src/WebDevToolsAgentPrivate.h +++ b/WebKit/chromium/src/WebDevToolsAgentPrivate.h @@ -31,9 +31,7 @@ #ifndef WebDevToolsAgentPrivate_h #define WebDevToolsAgentPrivate_h -// FIXME: This relative path is a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebDevToolsAgent.h" +#include "WebDevToolsAgent.h" namespace WebKit { class WebFrameImpl; @@ -45,11 +43,6 @@ public: // The window object for the frame has been cleared of any extra properties // that may have been set by script from the previously loaded document. virtual void didClearWindowObject(WebFrameImpl*) = 0; - - // The provisional datasource is now committed. The first part of the - // response body has been received, and the encoding of the response body - // is known. - virtual void didCommitProvisionalLoad(WebFrameImpl*, bool isNewNavigation) = 0; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebDevToolsFrontendImpl.cpp b/WebKit/chromium/src/WebDevToolsFrontendImpl.cpp index 89fa6e7..ea59ab6 100644 --- a/WebKit/chromium/src/WebDevToolsFrontendImpl.cpp +++ b/WebKit/chromium/src/WebDevToolsFrontendImpl.cpp @@ -35,25 +35,23 @@ #include "ContextMenuController.h" #include "ContextMenuItem.h" #include "DOMWindow.h" -#include "DebuggerAgent.h" -#include "DevToolsRPCJS.h" #include "Document.h" #include "Event.h" #include "Frame.h" #include "InspectorBackend.h" #include "InspectorController.h" +#include "InspectorFrontendClientImpl.h" #include "InspectorFrontendHost.h" #include "Node.h" #include "Page.h" #include "Pasteboard.h" #include "PlatformString.h" -#include "ProfilerAgent.h" #include "SecurityOrigin.h" #include "Settings.h" -#include "ToolsAgent.h" #include "V8Binding.h" #include "V8DOMWrapper.h" #include "V8InspectorFrontendHost.h" +#include "V8MouseEvent.h" #include "V8Node.h" #include "V8Proxy.h" #include "V8Utilities.h" @@ -76,10 +74,6 @@ static v8::Local<v8::String> ToV8String(const String& s) return v8::String::New(reinterpret_cast<const uint16_t*>(s.characters()), s.length()); } -DEFINE_RPC_JS_BOUND_OBJ(DebuggerAgent, DEBUGGER_AGENT_STRUCT, DebuggerAgentDelegate, DEBUGGER_AGENT_DELEGATE_STRUCT) -DEFINE_RPC_JS_BOUND_OBJ(ProfilerAgent, PROFILER_AGENT_STRUCT, ProfilerAgentDelegate, PROFILER_AGENT_DELEGATE_STRUCT) -DEFINE_RPC_JS_BOUND_OBJ(ToolsAgent, TOOLS_AGENT_STRUCT, ToolsAgentDelegate, TOOLS_AGENT_DELEGATE_STRUCT) - WebDevToolsFrontend* WebDevToolsFrontend::create( WebView* view, WebDevToolsFrontendClient* client, @@ -98,298 +92,40 @@ WebDevToolsFrontendImpl::WebDevToolsFrontendImpl( : m_webViewImpl(webViewImpl) , m_client(client) , m_applicationLocale(applicationLocale) - , m_loaded(false) { - WebFrameImpl* frame = m_webViewImpl->mainFrameImpl(); - v8::HandleScope scope; - v8::Handle<v8::Context> frameContext = V8Proxy::context(frame->frame()); - - m_debuggerAgentObj.set(new JSDebuggerAgentBoundObj(this, frameContext, "RemoteDebuggerAgent")); - m_profilerAgentObj.set(new JSProfilerAgentBoundObj(this, frameContext, "RemoteProfilerAgent")); - m_toolsAgentObj.set(new JSToolsAgentBoundObj(this, frameContext, "RemoteToolsAgent")); - - // Debugger commands should be sent using special method. - BoundObject debuggerCommandExecutorObj(frameContext, this, "RemoteDebuggerCommandExecutor"); - debuggerCommandExecutorObj.addProtoFunction( - "DebuggerCommand", - WebDevToolsFrontendImpl::jsDebuggerCommand); - debuggerCommandExecutorObj.addProtoFunction( - "DebuggerPauseScript", - WebDevToolsFrontendImpl::jsDebuggerPauseScript); - debuggerCommandExecutorObj.build(); + InspectorController* ic = m_webViewImpl->page()->inspectorController(); + ic->setInspectorFrontendClient(new InspectorFrontendClientImpl(m_webViewImpl->page(), m_client, this)); - BoundObject devToolsHost(frameContext, this, "InspectorFrontendHost"); - devToolsHost.addProtoFunction( - "loaded", - WebDevToolsFrontendImpl::jsLoaded); - devToolsHost.addProtoFunction( - "platform", - WebDevToolsFrontendImpl::jsPlatform); - devToolsHost.addProtoFunction( - "port", - WebDevToolsFrontendImpl::jsPort); - devToolsHost.addProtoFunction( - "copyText", - WebDevToolsFrontendImpl::jsCopyText); - devToolsHost.addProtoFunction( - "activateWindow", - WebDevToolsFrontendImpl::jsActivateWindow); - devToolsHost.addProtoFunction( - "closeWindow", - WebDevToolsFrontendImpl::jsCloseWindow); - devToolsHost.addProtoFunction( - "attach", - WebDevToolsFrontendImpl::jsDockWindow); - devToolsHost.addProtoFunction( - "detach", - WebDevToolsFrontendImpl::jsUndockWindow); - devToolsHost.addProtoFunction( - "localizedStringsURL", - WebDevToolsFrontendImpl::jsLocalizedStringsURL); - devToolsHost.addProtoFunction( - "hiddenPanels", - WebDevToolsFrontendImpl::jsHiddenPanels); - devToolsHost.addProtoFunction( - "setting", - WebDevToolsFrontendImpl::jsSetting); - devToolsHost.addProtoFunction( - "setSetting", - WebDevToolsFrontendImpl::jsSetSetting); - devToolsHost.addProtoFunction( - "windowUnloading", - WebDevToolsFrontendImpl::jsWindowUnloading); - devToolsHost.addProtoFunction( - "showContextMenu", - WebDevToolsFrontendImpl::jsShowContextMenu); - devToolsHost.build(); + // Put each DevTools frontend Page into its own (single page) group so that it's not + // deferred along with the inspected page. + m_webViewImpl->page()->setGroupName(String()); } WebDevToolsFrontendImpl::~WebDevToolsFrontendImpl() { - if (m_menuProvider) - m_menuProvider->disconnect(); } -void WebDevToolsFrontendImpl::dispatchMessageFromAgent(const WebDevToolsMessageData& data) -{ - Vector<String> v; - v.append(data.className); - v.append(data.methodName); - for (size_t i = 0; i < data.arguments.size(); i++) - v.append(data.arguments[i]); - if (!m_loaded) { - m_pendingIncomingMessages.append(v); - return; - } - executeScript(v); -} - -void WebDevToolsFrontendImpl::executeScript(const Vector<String>& v) +void WebDevToolsFrontendImpl::dispatchOnInspectorFrontend(const WebString& message) { WebFrameImpl* frame = m_webViewImpl->mainFrameImpl(); v8::HandleScope scope; v8::Handle<v8::Context> frameContext = V8Proxy::context(frame->frame()); v8::Context::Scope contextScope(frameContext); - v8::Handle<v8::Value> dispatchFunction = frameContext->Global()->Get(v8::String::New("devtools$$dispatch")); - ASSERT(dispatchFunction->IsFunction()); + v8::Handle<v8::Value> dispatchFunction = frameContext->Global()->Get(v8::String::New("WebInspector_syncDispatch")); + // The frame might have navigated away from the front-end page (which is still weird). + if (!dispatchFunction->IsFunction()) + return; v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(dispatchFunction); Vector< v8::Handle<v8::Value> > args; - for (size_t i = 0; i < v.size(); i++) - args.append(ToV8String(v.at(i))); + args.append(ToV8String(message)); + v8::TryCatch tryCatch; + tryCatch.SetVerbose(true); function->Call(frameContext->Global(), args.size(), args.data()); } -void WebDevToolsFrontendImpl::dispatchOnWebInspector(const String& methodName, const String& param) -{ - WebFrameImpl* frame = m_webViewImpl->mainFrameImpl(); - v8::HandleScope scope; - v8::Handle<v8::Context> frameContext = V8Proxy::context(frame->frame()); - v8::Context::Scope contextScope(frameContext); - - v8::Handle<v8::Value> webInspector = frameContext->Global()->Get(v8::String::New("WebInspector")); - ASSERT(webInspector->IsObject()); - v8::Handle<v8::Object> webInspectorObj = v8::Handle<v8::Object>::Cast(webInspector); - - v8::Handle<v8::Value> method = webInspectorObj->Get(ToV8String(methodName)); - ASSERT(method->IsFunction()); - v8::Handle<v8::Function> methodFunc = v8::Handle<v8::Function>::Cast(method); - v8::Handle<v8::Value> args[] = { - ToV8String(param) - }; - methodFunc->Call(frameContext->Global(), 1, args); -} - -void WebDevToolsFrontendImpl::sendRpcMessage(const WebDevToolsMessageData& data) -{ - m_client->sendMessageToAgent(data); -} - -void WebDevToolsFrontendImpl::contextMenuItemSelected(ContextMenuItem* item) -{ - int itemNumber = item->action() - ContextMenuItemBaseCustomTag; - dispatchOnWebInspector("contextMenuItemSelected", String::number(itemNumber)); -} - -void WebDevToolsFrontendImpl::contextMenuCleared() -{ - dispatchOnWebInspector("contextMenuCleared", ""); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsLoaded(const v8::Arguments& args) -{ - WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); - frontend->m_loaded = true; - - // Grant the devtools page the ability to have source view iframes. - Page* page = V8Proxy::retrieveFrameForEnteredContext()->page(); - SecurityOrigin* origin = page->mainFrame()->domWindow()->securityOrigin(); - origin->grantUniversalAccess(); - - for (Vector<Vector<String> >::iterator it = frontend->m_pendingIncomingMessages.begin(); - it != frontend->m_pendingIncomingMessages.end(); - ++it) { - frontend->executeScript(*it); - } - frontend->m_pendingIncomingMessages.clear(); - return v8::Undefined(); -} - -// static -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsPlatform(const v8::Arguments& args) -{ -#if defined(OS_MACOSX) - return v8String("mac"); -#elif defined(OS_LINUX) - return v8String("linux"); -#elif defined(OS_WIN) - return v8String("windows"); -#else - return v8String("unknown"); -#endif -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsPort(const v8::Arguments& args) -{ - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsCopyText(const v8::Arguments& args) -{ - String text = WebCore::toWebCoreStringWithNullCheck(args[0]); - Pasteboard::generalPasteboard()->writePlainText(text); - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsActivateWindow(const v8::Arguments& args) -{ - WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); - frontend->m_client->activateWindow(); - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsCloseWindow(const v8::Arguments& args) -{ - WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); - frontend->m_client->closeWindow(); - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsDockWindow(const v8::Arguments& args) -{ - WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); - frontend->m_client->dockWindow(); - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsUndockWindow(const v8::Arguments& args) -{ - WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); - frontend->m_client->undockWindow(); - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsLocalizedStringsURL(const v8::Arguments& args) -{ - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsHiddenPanels(const v8::Arguments& args) -{ - return v8String(""); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsDebuggerCommand(const v8::Arguments& args) -{ - WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); - WebString command = WebCore::toWebCoreStringWithNullCheck(args[0]); - frontend->m_client->sendDebuggerCommandToAgent(command); - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsSetting(const v8::Arguments& args) -{ - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsSetSetting(const v8::Arguments& args) +void WebDevToolsFrontendImpl::frontendLoaded() { - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsDebuggerPauseScript(const v8::Arguments& args) -{ - WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); - frontend->m_client->sendDebuggerPauseScript(); - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsWindowUnloading(const v8::Arguments& args) -{ - // TODO(pfeldman): Implement this. - return v8::Undefined(); -} - -v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsShowContextMenu(const v8::Arguments& args) -{ - if (args.Length() < 2) - return v8::Undefined(); - - v8::Local<v8::Object> eventWrapper = v8::Local<v8::Object>::Cast(args[0]); - if (V8DOMWrapper::domWrapperType(eventWrapper) != V8ClassIndex::MOUSEEVENT) - return v8::Undefined(); - - Event* event = V8Event::toNative(eventWrapper); - if (!args[1]->IsArray()) - return v8::Undefined(); - - v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(args[1]); - Vector<ContextMenuItem*> items; - - for (size_t i = 0; i < array->Length(); ++i) { - v8::Local<v8::Object> item = v8::Local<v8::Object>::Cast(array->Get(v8::Integer::New(i))); - v8::Local<v8::Value> label = item->Get(v8::String::New("label")); - v8::Local<v8::Value> id = item->Get(v8::String::New("id")); - if (label->IsUndefined() || id->IsUndefined()) { - items.append(new ContextMenuItem(SeparatorType, - ContextMenuItemTagNoAction, - String())); - } else { - ContextMenuAction typedId = static_cast<ContextMenuAction>( - ContextMenuItemBaseCustomTag + id->ToInt32()->Value()); - items.append(new ContextMenuItem(ActionType, - typedId, - toWebCoreStringWithNullCheck(label))); - } - } - - WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); - - frontend->m_menuProvider = MenuProvider::create(frontend, items); - - ContextMenuController* menuController = frontend->m_webViewImpl->page()->contextMenuController(); - menuController->showContextMenu(event, frontend->m_menuProvider); - - return v8::Undefined(); + m_client->sendFrontendLoaded(); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebDevToolsFrontendImpl.h b/WebKit/chromium/src/WebDevToolsFrontendImpl.h index 62b34da..866a1cb 100644 --- a/WebKit/chromium/src/WebDevToolsFrontendImpl.h +++ b/WebKit/chromium/src/WebDevToolsFrontendImpl.h @@ -31,11 +31,10 @@ #ifndef WebDevToolsFrontendImpl_h #define WebDevToolsFrontendImpl_h -#include "ContextMenu.h" -#include "ContextMenuProvider.h" -#include "DevToolsRPC.h" +#include "PlatformString.h" #include "WebDevToolsFrontend.h" #include <v8.h> +#include <wtf/Forward.h> #include <wtf/HashMap.h> #include <wtf/Noncopyable.h> #include <wtf/OwnPtr.h> @@ -46,20 +45,17 @@ namespace WebCore { class ContextMenuItem; class Node; class Page; -class String; } namespace WebKit { -class JSDebuggerAgentBoundObj; -class JSProfilerAgentBoundObj; -class JSToolsAgentBoundObj; class WebDevToolsClientDelegate; class WebViewImpl; struct WebDevToolsMessageData; +using WTF::String; + class WebDevToolsFrontendImpl : public WebKit::WebDevToolsFrontend - , public DevToolsRPC::Delegate , public Noncopyable { public: WebDevToolsFrontendImpl( @@ -68,92 +64,15 @@ public: const String& applicationLocale); virtual ~WebDevToolsFrontendImpl(); - // DevToolsRPC::Delegate implementation. - virtual void sendRpcMessage(const WebKit::WebDevToolsMessageData& data); - // WebDevToolsFrontend implementation. - virtual void dispatchMessageFromAgent(const WebKit::WebDevToolsMessageData& data); - -private: - class MenuProvider : public WebCore::ContextMenuProvider { - public: - static PassRefPtr<MenuProvider> create(WebDevToolsFrontendImpl* frontendHost, const Vector<WebCore::ContextMenuItem*>& items) - { - return adoptRef(new MenuProvider(frontendHost, items)); - } - - virtual ~MenuProvider() - { - contextMenuCleared(); - } - - void disconnect() - { - m_frontendHost = 0; - } - - virtual void populateContextMenu(WebCore::ContextMenu* menu) - { - for (size_t i = 0; i < m_items.size(); ++i) - menu->appendItem(*m_items[i]); - } + virtual void dispatchOnInspectorFrontend(const WebString& message); - virtual void contextMenuItemSelected(WebCore::ContextMenuItem* item) - { - if (m_frontendHost) - m_frontendHost->contextMenuItemSelected(item); - } - - virtual void contextMenuCleared() - { - if (m_frontendHost) - m_frontendHost->contextMenuCleared(); - deleteAllValues(m_items); - m_items.clear(); - } - - private: - MenuProvider(WebDevToolsFrontendImpl* frontendHost, const Vector<WebCore::ContextMenuItem*>& items) - : m_frontendHost(frontendHost) - , m_items(items) { } - WebDevToolsFrontendImpl* m_frontendHost; - Vector<WebCore::ContextMenuItem*> m_items; - }; - - void executeScript(const Vector<String>& v); - void dispatchOnWebInspector(const String& method, const String& param); - - // friend class MenuSelectionHandler; - void contextMenuItemSelected(WebCore::ContextMenuItem* menuItem); - void contextMenuCleared(); - - static v8::Handle<v8::Value> jsLoaded(const v8::Arguments& args); - static v8::Handle<v8::Value> jsPlatform(const v8::Arguments& args); - static v8::Handle<v8::Value> jsPort(const v8::Arguments& args); - static v8::Handle<v8::Value> jsCopyText(const v8::Arguments& args); - - static v8::Handle<v8::Value> jsActivateWindow(const v8::Arguments& args); - static v8::Handle<v8::Value> jsCloseWindow(const v8::Arguments& args); - static v8::Handle<v8::Value> jsDockWindow(const v8::Arguments& args); - static v8::Handle<v8::Value> jsUndockWindow(const v8::Arguments& args); - static v8::Handle<v8::Value> jsLocalizedStringsURL(const v8::Arguments& args); - static v8::Handle<v8::Value> jsHiddenPanels(const v8::Arguments& args); - static v8::Handle<v8::Value> jsDebuggerCommand(const v8::Arguments& args); - static v8::Handle<v8::Value> jsSetting(const v8::Arguments& args); - static v8::Handle<v8::Value> jsSetSetting(const v8::Arguments& args); - static v8::Handle<v8::Value> jsDebuggerPauseScript(const v8::Arguments& args); - static v8::Handle<v8::Value> jsWindowUnloading(const v8::Arguments& args); - static v8::Handle<v8::Value> jsShowContextMenu(const v8::Arguments& args); + void frontendLoaded(); +private: WebKit::WebViewImpl* m_webViewImpl; WebKit::WebDevToolsFrontendClient* m_client; String m_applicationLocale; - OwnPtr<JSDebuggerAgentBoundObj> m_debuggerAgentObj; - OwnPtr<JSProfilerAgentBoundObj> m_profilerAgentObj; - OwnPtr<JSToolsAgentBoundObj> m_toolsAgentObj; - bool m_loaded; - Vector<Vector<String> > m_pendingIncomingMessages; - RefPtr<MenuProvider> m_menuProvider; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebDeviceOrientation.cpp b/WebKit/chromium/src/WebDeviceOrientation.cpp new file mode 100644 index 0000000..47f6bd1 --- /dev/null +++ b/WebKit/chromium/src/WebDeviceOrientation.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebDeviceOrientation.h" + +#include "DeviceOrientation.h" +#include <wtf/PassRefPtr.h> + +namespace WebKit { + +WebDeviceOrientation::WebDeviceOrientation(const PassRefPtr<WebCore::DeviceOrientation>& orientation) +{ + if (!orientation) { + m_isNull = true; + m_canProvideAlpha = false; + m_alpha = 0; + m_canProvideBeta = false; + m_beta = 0; + m_canProvideGamma = false; + m_gamma = 0; + return; + } + + m_isNull = false; + m_canProvideAlpha = orientation->canProvideAlpha(); + m_alpha = orientation->alpha(); + m_canProvideBeta = orientation->canProvideBeta(); + m_beta = orientation->beta(); + m_canProvideGamma = orientation->canProvideGamma(); + m_gamma = orientation->gamma(); +} + +WebDeviceOrientation& WebDeviceOrientation::operator=(const PassRefPtr<WebCore::DeviceOrientation>& orientation) +{ + if (!orientation) { + m_isNull = true; + m_canProvideAlpha = false; + m_alpha = 0; + m_canProvideBeta = false; + m_beta = 0; + m_canProvideGamma = false; + m_gamma = 0; + return *this; + } + + m_isNull = false; + m_canProvideAlpha = orientation->canProvideAlpha(); + m_alpha = orientation->alpha(); + m_canProvideBeta = orientation->canProvideBeta(); + m_beta = orientation->beta(); + m_canProvideGamma = orientation->canProvideGamma(); + m_gamma = orientation->gamma(); + return *this; +} + +WebDeviceOrientation::operator PassRefPtr<WebCore::DeviceOrientation>() const +{ + if (m_isNull) + return 0; + return WebCore::DeviceOrientation::create(m_canProvideAlpha, m_alpha, m_canProvideBeta, m_beta, m_canProvideGamma, m_gamma); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebDeviceOrientationClientMock.cpp b/WebKit/chromium/src/WebDeviceOrientationClientMock.cpp new file mode 100644 index 0000000..8a75ca1 --- /dev/null +++ b/WebKit/chromium/src/WebDeviceOrientationClientMock.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebDeviceOrientationClientMock.h" + +#include "DeviceOrientationClientMock.h" +#include "WebDeviceOrientation.h" +#include "WebDeviceOrientationController.h" + +namespace WebKit { + +WebDeviceOrientationClientMock* WebDeviceOrientationClientMock::create() +{ + return new WebDeviceOrientationClientMock(); +} + +void WebDeviceOrientationClientMock::setController(WebDeviceOrientationController* controller) +{ + m_clientMock->setController(controller->controller()); + delete controller; +} + +void WebDeviceOrientationClientMock::startUpdating() +{ + m_clientMock->startUpdating(); +} + +void WebDeviceOrientationClientMock::stopUpdating() +{ + m_clientMock->stopUpdating(); +} + +WebDeviceOrientation WebDeviceOrientationClientMock::lastOrientation() const +{ + return WebDeviceOrientation(m_clientMock->lastOrientation()); +} + +void WebDeviceOrientationClientMock::setOrientation(WebDeviceOrientation& orientation) +{ + m_clientMock->setOrientation(orientation); +} + +void WebDeviceOrientationClientMock::initialize() +{ + m_clientMock.reset(new WebCore::DeviceOrientationClientMock()); +} + +void WebDeviceOrientationClientMock::reset() +{ + m_clientMock.reset(0); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebDeviceOrientationController.cpp b/WebKit/chromium/src/WebDeviceOrientationController.cpp new file mode 100644 index 0000000..aa9249f --- /dev/null +++ b/WebKit/chromium/src/WebDeviceOrientationController.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebDeviceOrientationController.h" + +#include "DeviceOrientation.h" +#include "DeviceOrientationController.h" +#include "WebDeviceOrientation.h" +#include <wtf/PassRefPtr.h> + +namespace WebKit { + +void WebDeviceOrientationController::didChangeDeviceOrientation(const WebDeviceOrientation& orientation) +{ + PassRefPtr<WebCore::DeviceOrientation> deviceOrientation(orientation); + m_controller->didChangeDeviceOrientation(deviceOrientation.get()); +} + +WebCore::DeviceOrientationController* WebDeviceOrientationController::controller() const +{ + return m_controller; +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebDocument.cpp b/WebKit/chromium/src/WebDocument.cpp index 84f3004..a983bf7 100644 --- a/WebKit/chromium/src/WebDocument.cpp +++ b/WebKit/chromium/src/WebDocument.cpp @@ -32,7 +32,7 @@ #include "WebDocument.h" #include "Document.h" -#include "DocumentLoader.h" +#include "DocumentType.h" #include "Element.h" #include "HTMLAllCollection.h" #include "HTMLBodyElement.h" @@ -41,9 +41,11 @@ #include "HTMLHeadElement.h" #include "NodeList.h" +#include "WebDocumentType.h" #include "WebElement.h" #include "WebFrameImpl.h" #include "WebNodeCollection.h" +#include "WebNodeList.h" #include "WebURL.h" #include <wtf/PassRefPtr.h> @@ -52,30 +54,24 @@ using namespace WebCore; namespace WebKit { -WebDocument::WebDocument(const PassRefPtr<Document>& elem) - : WebNode(elem.releaseRef()) -{ -} - -WebDocument& WebDocument::operator=(const PassRefPtr<Document>& elem) +WebFrame* WebDocument::frame() const { - WebNode::assign(elem.releaseRef()); - return *this; + return WebFrameImpl::fromFrame(constUnwrap<Document>()->frame()); } -WebDocument::operator PassRefPtr<Document>() const -{ - return PassRefPtr<Document>(static_cast<Document*>(m_private)); +bool WebDocument::isHTMLDocument() const +{ + return constUnwrap<Document>()->isHTMLDocument(); } -WebFrame* WebDocument::frame() const +bool WebDocument::isXHTMLDocument() const { - return WebFrameImpl::fromFrame(constUnwrap<Document>()->frame()); + return constUnwrap<Document>()->isXHTMLDocument(); } -bool WebDocument::isHTMLDocument() const +bool WebDocument::isPluginDocument() const { - return constUnwrap<Document>()->isHTMLDocument(); + return constUnwrap<Document>()->isPluginDocument(); } WebURL WebDocument::baseURL() const @@ -83,6 +79,11 @@ WebURL WebDocument::baseURL() const return constUnwrap<Document>()->baseURL(); } +WebURL WebDocument::firstPartyForCookies() const +{ + return constUnwrap<Document>()->firstPartyForCookies(); +} + WebElement WebDocument::documentElement() const { return WebElement(constUnwrap<Document>()->documentElement()); @@ -98,6 +99,11 @@ WebElement WebDocument::head() return WebElement(unwrap<Document>()->head()); } +WebString WebDocument::title() const +{ + return WebString(constUnwrap<Document>()->title()); +} + WebNodeCollection WebDocument::all() { return WebNodeCollection(unwrap<Document>()->all()); @@ -113,38 +119,30 @@ WebElement WebDocument::getElementById(const WebString& id) const return WebElement(constUnwrap<Document>()->getElementById(id)); } -WebString WebDocument::applicationID() const +WebNode WebDocument::focusedNode() const { - const char* kChromeApplicationHeader = "x-chrome-application"; - - // First check if the document's response included a header indicating the - // application it should go with. - const Document* document = constUnwrap<Document>(); - Frame* frame = document->frame(); - if (!frame) - return WebString(); + return WebNode(constUnwrap<Document>()->focusedNode()); +} - DocumentLoader* loader = frame->loader()->documentLoader(); - if (!loader) - return WebString(); +WebDocumentType WebDocument::doctype() const +{ + return WebDocumentType(constUnwrap<Document>()->doctype()); +} - WebString headerValue = - loader->response().httpHeaderField(kChromeApplicationHeader); - if (!headerValue.isEmpty()) - return headerValue; +WebDocument::WebDocument(const PassRefPtr<Document>& elem) + : WebNode(elem) +{ +} - // Otherwise, fall back to looking for the meta tag. - RefPtr<NodeList> metaTags = - const_cast<Document*>(document)->getElementsByTagName("meta"); - for (unsigned i = 0; i < metaTags->length(); ++i) { - Element* element = static_cast<Element*>(metaTags->item(i)); - if (element->getAttribute("http-equiv").lower() == - kChromeApplicationHeader) { - return element->getAttribute("value"); - } - } +WebDocument& WebDocument::operator=(const PassRefPtr<Document>& elem) +{ + m_private = elem; + return *this; +} - return WebString(); +WebDocument::operator PassRefPtr<Document>() const +{ + return static_cast<Document*>(m_private.get()); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebDocumentType.cpp b/WebKit/chromium/src/WebDocumentType.cpp new file mode 100644 index 0000000..bbf28e7 --- /dev/null +++ b/WebKit/chromium/src/WebDocumentType.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebDocumentType.h" + +#include "DocumentType.h" +#include "WebString.h" + +#include <wtf/PassRefPtr.h> + +using namespace WebCore; + +namespace WebKit { + +WebString WebDocumentType::name() const +{ + return WebString(constUnwrap<DocumentType>()->name()); +} + +WebDocumentType::WebDocumentType(const PassRefPtr<DocumentType>& elem) + : WebNode(elem) +{ +} + +WebDocumentType& WebDocumentType::operator=(const PassRefPtr<DocumentType>& elem) +{ + m_private = elem; + return *this; +} + +WebDocumentType::operator PassRefPtr<DocumentType>() const +{ + return static_cast<DocumentType*>(m_private.get()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebDragData.cpp b/WebKit/chromium/src/WebDragData.cpp index b18ab1b..9167c69 100644 --- a/WebKit/chromium/src/WebDragData.cpp +++ b/WebKit/chromium/src/WebDragData.cpp @@ -32,6 +32,8 @@ #include "WebDragData.h" #include "ChromiumDataObject.h" +#include "ChromiumDataObjectLegacy.h" +#include "ClipboardMimeTypes.h" #include "WebData.h" #include "WebString.h" #include "WebURL.h" @@ -48,7 +50,7 @@ class WebDragDataPrivate : public ChromiumDataObject { void WebDragData::initialize() { - assign(static_cast<WebDragDataPrivate*>(ChromiumDataObject::create().releaseRef())); + assign(static_cast<WebDragDataPrivate*>(ChromiumDataObject::create(ChromiumDataObjectLegacy::create(Clipboard::DragAndDrop)).releaseRef())); } void WebDragData::reset() @@ -64,149 +66,144 @@ void WebDragData::assign(const WebDragData& other) assign(p); } -WebURL WebDragData::url() const +WebString WebDragData::url() const { ASSERT(!isNull()); - return m_private->url; + bool ignoredSuccess; + return m_private->getData(mimeTypeURL, ignoredSuccess); } void WebDragData::setURL(const WebURL& url) { ensureMutable(); - m_private->url = url; + m_private->setData(mimeTypeURL, KURL(url).string()); } WebString WebDragData::urlTitle() const { ASSERT(!isNull()); - return m_private->urlTitle; + return m_private->urlTitle(); } void WebDragData::setURLTitle(const WebString& urlTitle) { ensureMutable(); - m_private->urlTitle = urlTitle; -} - -WebURL WebDragData::downloadURL() const -{ - ASSERT(!isNull()); - return m_private->downloadURL; -} - -void WebDragData::setDownloadURL(const WebURL& downloadURL) -{ - ensureMutable(); - m_private->downloadURL = downloadURL; + m_private->setUrlTitle(urlTitle); } WebString WebDragData::downloadMetadata() const { ASSERT(!isNull()); - return m_private->downloadMetadata; + bool ignoredSuccess; + return m_private->getData(mimeTypeDownloadURL, ignoredSuccess); } void WebDragData::setDownloadMetadata(const WebString& downloadMetadata) { ensureMutable(); - m_private->downloadMetadata = downloadMetadata; + m_private->setData(mimeTypeDownloadURL, downloadMetadata); } WebString WebDragData::fileExtension() const { ASSERT(!isNull()); - return m_private->fileExtension; + return m_private->fileExtension(); } void WebDragData::setFileExtension(const WebString& fileExtension) { ensureMutable(); - m_private->fileExtension = fileExtension; + m_private->setFileExtension(fileExtension); } -bool WebDragData::hasFileNames() const +bool WebDragData::containsFilenames() const { ASSERT(!isNull()); - return !m_private->filenames.isEmpty(); + return m_private->containsFilenames(); } -void WebDragData::fileNames(WebVector<WebString>& fileNames) const +void WebDragData::filenames(WebVector<WebString>& filenames) const { ASSERT(!isNull()); - fileNames = m_private->filenames; + filenames = m_private->filenames(); } -void WebDragData::setFileNames(const WebVector<WebString>& fileNames) +void WebDragData::setFilenames(const WebVector<WebString>& filenames) { ensureMutable(); - m_private->filenames.clear(); - m_private->filenames.append(fileNames.data(), fileNames.size()); + Vector<String> filenamesCopy; + filenamesCopy.append(filenames.data(), filenames.size()); + m_private->setFilenames(filenamesCopy); } -void WebDragData::appendToFileNames(const WebString& fileName) +void WebDragData::appendToFilenames(const WebString& filename) { ensureMutable(); - m_private->filenames.append(fileName); + Vector<String> filenames = m_private->filenames(); + filenames.append(filename); + m_private->setFilenames(filenames); } WebString WebDragData::plainText() const { ASSERT(!isNull()); - return m_private->plainText; + bool ignoredSuccess; + return m_private->getData(mimeTypeTextPlain, ignoredSuccess); } void WebDragData::setPlainText(const WebString& plainText) { ensureMutable(); - m_private->plainText = plainText; + m_private->setData(mimeTypeTextPlain, plainText); } WebString WebDragData::htmlText() const { ASSERT(!isNull()); - return m_private->textHtml; + bool ignoredSuccess; + return m_private->getData(mimeTypeTextHTML, ignoredSuccess); } void WebDragData::setHTMLText(const WebString& htmlText) { ensureMutable(); - m_private->textHtml = htmlText; + m_private->setData(mimeTypeTextHTML, htmlText); } WebURL WebDragData::htmlBaseURL() const { ASSERT(!isNull()); - return m_private->htmlBaseUrl; + return m_private->htmlBaseUrl(); } void WebDragData::setHTMLBaseURL(const WebURL& htmlBaseURL) { ensureMutable(); - m_private->htmlBaseUrl = htmlBaseURL; + m_private->setHtmlBaseUrl(htmlBaseURL); } -WebString WebDragData::fileContentFileName() const +WebString WebDragData::fileContentFilename() const { ASSERT(!isNull()); - return m_private->fileContentFilename; + return m_private->fileContentFilename(); } -void WebDragData::setFileContentFileName(const WebString& fileName) +void WebDragData::setFileContentFilename(const WebString& filename) { ensureMutable(); - m_private->fileContentFilename = fileName; + m_private->setFileContentFilename(filename); } WebData WebDragData::fileContent() const { ASSERT(!isNull()); - return WebData(m_private->fileContent); + return WebData(m_private->fileContent()); } void WebDragData::setFileContent(const WebData& fileContent) { ensureMutable(); - m_private->fileContent = fileContent; + m_private->setFileContent(fileContent); } WebDragData::WebDragData(const WTF::PassRefPtr<WebCore::ChromiumDataObject>& data) @@ -236,8 +233,7 @@ void WebDragData::assign(WebDragDataPrivate* p) void WebDragData::ensureMutable() { ASSERT(!isNull()); - if (!m_private->hasOneRef()) - assign(static_cast<WebDragDataPrivate*>(m_private->copy().releaseRef())); + ASSERT(m_private->hasOneRef()); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebElement.cpp b/WebKit/chromium/src/WebElement.cpp index d0a0862..34daa34 100644 --- a/WebKit/chromium/src/WebElement.cpp +++ b/WebKit/chromium/src/WebElement.cpp @@ -32,26 +32,24 @@ #include "WebElement.h" #include "Element.h" +#include "RenderBoxModelObject.h" +#include "RenderObject.h" #include <wtf/PassRefPtr.h> +#include "WebNamedNodeMap.h" + using namespace WebCore; namespace WebKit { -WebElement::WebElement(const WTF::PassRefPtr<WebCore::Element>& elem) - : WebNode(elem.releaseRef()) -{ -} - -WebElement& WebElement::operator=(const WTF::PassRefPtr<WebCore::Element>& elem) +bool WebElement::isFormControlElement() const { - WebNode::assign(elem.releaseRef()); - return *this; + return constUnwrap<Element>()->isFormControlElement(); } -WebElement::operator WTF::PassRefPtr<Element>() const +bool WebElement::isTextFormControlElement() const { - return PassRefPtr<Element>(static_cast<Element*>(m_private)); + return constUnwrap<Element>()->isTextFormControl(); } WebString WebElement::tagName() const @@ -62,7 +60,7 @@ WebString WebElement::tagName() const bool WebElement::hasTagName(const WebString& tagName) const { return equalIgnoringCase(constUnwrap<Element>()->tagName(), - tagName.operator WebCore::String()); + tagName.operator String()); } bool WebElement::hasAttribute(const WebString& attrName) const @@ -82,10 +80,35 @@ bool WebElement::setAttribute(const WebString& attrName, const WebString& attrVa return !exceptionCode; } +WebNamedNodeMap WebElement::attributes() const +{ + return WebNamedNodeMap(m_private->attributes()); +} + WebString WebElement::innerText() const { return constUnwrap<Element>()->innerText(); } -} // namespace WebKit +WebString WebElement::computeInheritedLanguage() const +{ + return WebString(constUnwrap<Element>()->computeInheritedLanguage()); +} +WebElement::WebElement(const PassRefPtr<Element>& elem) + : WebNode(elem) +{ +} + +WebElement& WebElement::operator=(const PassRefPtr<Element>& elem) +{ + m_private = elem; + return *this; +} + +WebElement::operator PassRefPtr<Element>() const +{ + return static_cast<Element*>(m_private.get()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebEntities.cpp b/WebKit/chromium/src/WebEntities.cpp index b9143d9..4e37dde 100644 --- a/WebKit/chromium/src/WebEntities.cpp +++ b/WebKit/chromium/src/WebEntities.cpp @@ -31,69 +31,26 @@ #include "config.h" #include "WebEntities.h" -#include <string.h> - -#include "PlatformString.h" -#include "StringBuilder.h" -#include <wtf/HashMap.h> - #include "WebString.h" -using namespace WebCore; - -namespace { -// Note that this file is also included by HTMLTokenizer.cpp so we are getting -// two copies of the data in memory. We can fix this by changing the script -// that generated the array to create a static const that is its length, but -// this is low priority since the data is less than 4K. We use anonymous -// namespace to prevent name collisions. -#include "HTMLEntityNames.c" // NOLINT -} +#include <string.h> +#include <wtf/HashMap.h> +#include <wtf/text/StringBuilder.h> +#include <wtf/text/WTFString.h> namespace WebKit { -void populateMap(WTF::HashMap<int, WebCore::String>& map, - const Entity* entities, - size_t entitiesCount, - bool standardHTML) -{ - ASSERT(map.isEmpty()); - const Entity* entity = &entities[0]; - for (size_t i = 0; i < entitiesCount; i++, entity++) { - int code = entity->code; - String name = entity->name; - // For consistency, use the lowe case for entities that have both. - if (map.contains(code) && map.get(code) == name.lower()) - continue; - // Don't register %, ⊅ and &supl;. - if (standardHTML && (code == '%' || code == 0x2285 || code == 0x00b9)) - continue; - map.set(code, name); - } - if (standardHTML) - map.set(static_cast<int>(0x0027), String("#39")); -} - -static const Entity xmlBuiltInEntityCodes[] = { - { "lt", 0x003c }, - { "gt", 0x003e }, - { "amp", 0x0026 }, - { "apos", 0x0027 }, - { "quot", 0x0022 } -}; - WebEntities::WebEntities(bool xmlEntities) { - if (xmlEntities) - populateMap(m_entitiesMap, - xmlBuiltInEntityCodes, - sizeof(xmlBuiltInEntityCodes) / sizeof(Entity), - false); - else - populateMap(m_entitiesMap, - wordlist, - sizeof(wordlist) / sizeof(Entity), - true); + ASSERT(m_entitiesMap.isEmpty()); + m_entitiesMap.set(0x003c, "lt"); + m_entitiesMap.set(0x003e, "gt"); + m_entitiesMap.set(0x0026, "amp"); + m_entitiesMap.set(0x0027, "apos"); + m_entitiesMap.set(0x0022, "quot"); + // We add #39 for test-compatibility reason. + if (!xmlEntities) + m_entitiesMap.set(0x0027, String("#39")); } String WebEntities::entityNameByCode(int code) const @@ -116,9 +73,9 @@ String WebEntities::convertEntitiesInString(const String& value) const // Append content before entity code. if (curPos > startPos) result.append(String(startPos, curPos - startPos)); - result.append("&"); + result.append('&'); result.append(m_entitiesMap.get(*curPos)); - result.append(";"); + result.append(';'); startPos = ++curPos; } else curPos++; diff --git a/WebKit/chromium/src/WebEntities.h b/WebKit/chromium/src/WebEntities.h index ad3c310..f210566 100644 --- a/WebKit/chromium/src/WebEntities.h +++ b/WebKit/chromium/src/WebEntities.h @@ -36,6 +36,7 @@ namespace WebKit { +// FIXME: This class is wrong and needs to be removed. class WebEntities { public: // ', %, ⊅, &supl; are not defined by the HTML standards. @@ -59,12 +60,12 @@ public: // entity name. If yes, return the entity notation. If not, returns an // empty string. Parameter isHTML indicates check the code in html entity // map or in xml entity map. - WebCore::String entityNameByCode(int code) const; + WTF::String entityNameByCode(int code) const; // Returns a new string with corresponding entity names replaced. - WebCore::String convertEntitiesInString(const WebCore::String&) const; + WTF::String convertEntitiesInString(const WTF::String&) const; private: - typedef HashMap<int, WebCore::String> EntitiesMapType; + typedef HashMap<int, WTF::String> EntitiesMapType; // An internal object that maps the Unicode character to corresponding // entity notation. EntitiesMapType m_entitiesMap; diff --git a/WebKit/chromium/src/WebFileChooserCompletionImpl.cpp b/WebKit/chromium/src/WebFileChooserCompletionImpl.cpp index 4152dc5..ef2409c 100644 --- a/WebKit/chromium/src/WebFileChooserCompletionImpl.cpp +++ b/WebKit/chromium/src/WebFileChooserCompletionImpl.cpp @@ -48,7 +48,7 @@ void WebFileChooserCompletionImpl::didChooseFile(const WebVector<WebString>& fil m_fileChooser->chooseFile(fileNames[0]); else { // This clause handles a case of file_names.size()==0 too. - Vector<WebCore::String> paths; + Vector<WTF::String> paths; for (size_t i = 0; i < fileNames.size(); ++i) paths.append(fileNames[i]); m_fileChooser->chooseFiles(paths); diff --git a/WebKit/chromium/src/WebFileChooserCompletionImpl.h b/WebKit/chromium/src/WebFileChooserCompletionImpl.h index fe759e0..147d1f7 100644 --- a/WebKit/chromium/src/WebFileChooserCompletionImpl.h +++ b/WebKit/chromium/src/WebFileChooserCompletionImpl.h @@ -31,14 +31,11 @@ #ifndef WebFileChooserCompletionImpl_h #define WebFileChooserCompletionImpl_h -// FIXME: These relative paths are a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebFileChooserCompletion.h" -#include "../public/WebString.h" -#include "../public/WebVector.h" +#include "WebFileChooserCompletion.h" +#include "WebString.h" +#include "WebVector.h" #include "FileChooser.h" - #include <wtf/PassRefPtr.h> using WebKit::WebFileChooserCompletion; diff --git a/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp b/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp new file mode 100644 index 0000000..52a4032 --- /dev/null +++ b/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebFileSystemCallbacksImpl.h" + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileSystemCallbacks.h" +#include "AsyncFileSystemChromium.h" +#include "FileMetadata.h" +#include "ScriptExecutionContext.h" +#include "WebFileSystemEntry.h" +#include "WebFileInfo.h" +#include "WebString.h" +#include "WorkerAsyncFileSystemChromium.h" +#include <wtf/Vector.h> + +using namespace WebCore; + +namespace WebKit { + +WebFileSystemCallbacksImpl::WebFileSystemCallbacksImpl(PassOwnPtr<AsyncFileSystemCallbacks> callbacks, WebCore::ScriptExecutionContext* context, bool synchronous) + : m_callbacks(callbacks) + , m_context(context) + , m_synchronous(synchronous) +{ + ASSERT(m_callbacks); +} + +WebFileSystemCallbacksImpl::~WebFileSystemCallbacksImpl() +{ +} + +void WebFileSystemCallbacksImpl::didSucceed() +{ + m_callbacks->didSucceed(); + delete this; +} + +void WebFileSystemCallbacksImpl::didReadMetadata(const WebFileInfo& webFileInfo) +{ + FileMetadata fileMetadata; + fileMetadata.modificationTime = webFileInfo.modificationTime; + fileMetadata.length = webFileInfo.length; + fileMetadata.type = static_cast<FileMetadata::Type>(webFileInfo.type); + m_callbacks->didReadMetadata(fileMetadata); + delete this; +} + +void WebFileSystemCallbacksImpl::didReadDirectory(const WebVector<WebFileSystemEntry>& entries, bool hasMore) +{ + for (size_t i = 0; i < entries.size(); ++i) + m_callbacks->didReadDirectoryEntry(entries[i].name, entries[i].isDirectory); + m_callbacks->didReadDirectoryEntries(hasMore); + delete this; +} + +void WebFileSystemCallbacksImpl::didOpenFileSystem(const WebString& name, const WebString& path) +{ + if (m_context && m_context->isWorkerContext()) + m_callbacks->didOpenFileSystem(name, WorkerAsyncFileSystemChromium::create(m_context, path, m_synchronous)); + else + m_callbacks->didOpenFileSystem(name, AsyncFileSystemChromium::create(path)); + delete this; +} + +void WebFileSystemCallbacksImpl::didFail(WebFileError error) +{ + m_callbacks->didFail(error); + delete this; +} + +} // namespace WebKit + +#endif // ENABLE(FILE_SYSTEM) diff --git a/WebKit/chromium/src/WebFileSystemCallbacksImpl.h b/WebKit/chromium/src/WebFileSystemCallbacksImpl.h new file mode 100644 index 0000000..75fa2bb --- /dev/null +++ b/WebKit/chromium/src/WebFileSystemCallbacksImpl.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WebFileSystemCallbacksImpl_h +#define WebFileSystemCallbacksImpl_h + +#include "WebFileSystemCallbacks.h" +#include "WebVector.h" +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> + +namespace WebCore { +class AsyncFileSystemCallbacks; +class ScriptExecutionContext; +} + +namespace WebKit { + +struct WebFileInfo; +struct WebFileSystemEntry; +class WebString; + +class WebFileSystemCallbacksImpl : public WebFileSystemCallbacks { +public: + WebFileSystemCallbacksImpl(PassOwnPtr<WebCore::AsyncFileSystemCallbacks>, WebCore::ScriptExecutionContext* = 0, bool synchronous = false); + virtual ~WebFileSystemCallbacksImpl(); + + virtual void didSucceed(); + virtual void didReadMetadata(const WebFileInfo& info); + virtual void didReadDirectory(const WebVector<WebFileSystemEntry>& entries, bool hasMore); + virtual void didOpenFileSystem(const WebString& name, const WebString& rootPath); + virtual void didFail(WebFileError error); + +private: + OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks; + + // Used for worker's openFileSystem callbacks. + WebCore::ScriptExecutionContext* m_context; + bool m_synchronous; +}; + +} // namespace WebKit + +#endif // WebFileSystemCallbacksImpl_h diff --git a/WebKit/chromium/src/WebFontDescription.cpp b/WebKit/chromium/src/WebFontDescription.cpp new file mode 100644 index 0000000..18f6830 --- /dev/null +++ b/WebKit/chromium/src/WebFontDescription.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebFontDescription.h" + +#include "FontDescription.h" + +using namespace WebCore; + +namespace WebKit { + +WebFontDescription::WebFontDescription(const FontDescription& desc, + short fontLetterSpacing, short fontWordSpacing) +{ + family = desc.family().family(); + genericFamily = static_cast<GenericFamily>(desc.genericFamily()); + size = desc.specifiedSize(); + italic = desc.italic(); + smallCaps = desc.smallCaps(); + weight = static_cast<Weight>(desc.weight()); + smoothing = static_cast<Smoothing>(desc.fontSmoothing()); + letterSpacing = fontLetterSpacing; + wordSpacing = fontWordSpacing; +} + +WebFontDescription::operator WebCore::FontDescription() const +{ + FontFamily fontFamily; + fontFamily.setFamily(family); + + FontDescription desc; + desc.setFamily(fontFamily); + desc.setGenericFamily(static_cast<FontDescription::GenericFamilyType>(genericFamily)); + desc.setSpecifiedSize(size); + desc.setComputedSize(size); + desc.setItalic(italic); + desc.setSmallCaps(smallCaps); + desc.setWeight(static_cast<FontWeight>(weight)); + desc.setFontSmoothing(static_cast<FontSmoothingMode>(smoothing)); + return desc; +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebFontImpl.cpp b/WebKit/chromium/src/WebFontImpl.cpp new file mode 100644 index 0000000..8c61997 --- /dev/null +++ b/WebKit/chromium/src/WebFontImpl.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebFontImpl.h" + +#include "Font.h" +#include "FontDescription.h" +#include "GraphicsContext.h" +#include "PlatformContextSkia.h" +#include "WebFloatPoint.h" +#include "WebFloatRect.h" +#include "WebFontDescription.h" +#include "WebRect.h" +#include "WebTextRun.h" + +using namespace WebCore; + +namespace WebKit { + +WebFont* WebFont::create(const WebFontDescription& desc) +{ + return new WebFontImpl(desc, desc.letterSpacing, desc.wordSpacing); +} + +WebFontImpl::WebFontImpl(const FontDescription& desc, short letterSpacing, short wordSpacing) + : m_font(desc, letterSpacing, wordSpacing) +{ + m_font.update(0); +} + +WebFontDescription WebFontImpl::fontDescription() const +{ + return WebFontDescription(m_font.fontDescription(), m_font.letterSpacing(), m_font.wordSpacing()); +} + +int WebFontImpl::ascent() const +{ + return m_font.ascent(); +} + +int WebFontImpl::descent() const +{ + return m_font.descent(); +} + +int WebFontImpl::height() const +{ + return m_font.height(); +} + +int WebFontImpl::lineSpacing() const +{ + return m_font.lineSpacing(); +} + +float WebFontImpl::xHeight() const +{ + return m_font.xHeight(); +} + +void WebFontImpl::drawText(WebCanvas* canvas, const WebTextRun& run, const WebFloatPoint& leftBaseline, + WebColor color, const WebRect& clip, bool canvasIsOpaque, + int from, int to) const +{ + // FIXME hook canvasIsOpaque up to the platform-specific indicators for + // whether subpixel AA can be used for this draw. On Windows, this is + // PlatformContextSkia::setDrawingToImageBuffer. +#if WEBKIT_USING_CG + GraphicsContext gc(canvas); +#elif WEBKIT_USING_SKIA + PlatformContextSkia context(canvas); + // PlatformGraphicsContext is actually a pointer to PlatformContextSkia. + GraphicsContext gc(reinterpret_cast<PlatformGraphicsContext*>(&context)); +#else + notImplemented(); +#endif + + gc.save(); + gc.setFillColor(color, ColorSpaceDeviceRGB); + gc.clip(WebCore::FloatRect(clip)); + m_font.drawText(&gc, run, leftBaseline, from, to); + gc.restore(); +} + +int WebFontImpl::calculateWidth(const WebTextRun& run) const +{ + return m_font.width(run, 0); +} + +int WebFontImpl::offsetForPosition(const WebTextRun& run, float position) const +{ + return m_font.offsetForPosition(run, position, true); +} + +WebFloatRect WebFontImpl::selectionRectForText(const WebTextRun& run, const WebFloatPoint& leftBaseline, int height, int from, int to) const +{ + return m_font.selectionRectForText(run, leftBaseline, height, from, to); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/ProfilerAgent.h b/WebKit/chromium/src/WebFontImpl.h index 52337b8..3ac9031 100644 --- a/WebKit/chromium/src/ProfilerAgent.h +++ b/WebKit/chromium/src/WebFontImpl.h @@ -28,33 +28,38 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef ProfilerAgent_h -#define ProfilerAgent_h +#ifndef WebFontImpl_h +#define WebFontImpl_h -#include "DevToolsRPC.h" +#include "Font.h" +#include "WebFont.h" + +namespace WebCore { class FontDescription; } namespace WebKit { -// Profiler agent provides API for retrieving profiler data. -// These methods are handled on the IO thread, so profiler can -// operate while a script on a page performs heavy work. -#define PROFILER_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \ - /* Requests current profiler state. */ \ - METHOD0(getActiveProfilerModules) \ - \ - /* Retrieves portion of profiler log. */ \ - METHOD1(getLogLines, int /* position */) - -DEFINE_RPC_CLASS(ProfilerAgent, PROFILER_AGENT_STRUCT) - -#define PROFILER_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \ - /* Response to getActiveProfilerModules. */ \ - METHOD1(didGetActiveProfilerModules, int /* flags */) \ - \ - /* Response to getLogLines. */ \ - METHOD2(didGetLogLines, int /* position */, String /* log */) - -DEFINE_RPC_CLASS(ProfilerAgentDelegate, PROFILER_AGENT_DELEGATE_STRUCT) +class WebFontImpl : public WebFont { +public: + WebFontImpl(const WebCore::FontDescription&, short letterSpacing, short wordSpacing); + + virtual WebFontDescription fontDescription() const; + + virtual int ascent() const; + virtual int descent() const; + virtual int height() const; + virtual int lineSpacing() const; + virtual float xHeight() const; + + virtual void drawText(WebCanvas*, const WebTextRun&, const WebFloatPoint& leftBaseline, WebColor, + const WebRect& clip, bool canvasIsOpaque, int from = 0, int to = -1) const; + virtual int calculateWidth(const WebTextRun&) const; + virtual int offsetForPosition(const WebTextRun&, float position) const; + virtual WebFloatRect selectionRectForText(const WebTextRun&, const WebFloatPoint& leftBaseline, + int height, int from = 0, int to = -1) const; + +private: + WebCore::Font m_font; +}; } // namespace WebKit diff --git a/WebKit/chromium/src/WebFormControlElement.cpp b/WebKit/chromium/src/WebFormControlElement.cpp new file mode 100644 index 0000000..a75fe5c --- /dev/null +++ b/WebKit/chromium/src/WebFormControlElement.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebFormControlElement.h" + +#include "HTMLFormControlElement.h" +#include <wtf/PassRefPtr.h> + +using namespace WebCore; + +namespace WebKit { + +bool WebFormControlElement::isEnabled() const +{ + return constUnwrap<HTMLFormControlElement>()->isEnabledFormControl(); +} + +WebString WebFormControlElement::formControlName() const +{ + return constUnwrap<HTMLFormControlElement>()->name(); +} + +WebString WebFormControlElement::formControlType() const +{ + return constUnwrap<HTMLFormControlElement>()->type(); +} + +WebString WebFormControlElement::nameForAutofill() const +{ + String name = constUnwrap<HTMLFormControlElement>()->name(); + String trimmedName = name.stripWhiteSpace(); + if (!trimmedName.isEmpty()) + return trimmedName; + name = constUnwrap<HTMLFormControlElement>()->getIdAttribute(); + trimmedName = name.stripWhiteSpace(); + if (!trimmedName.isEmpty()) + return trimmedName; + return String(); +} + +WebFormControlElement::WebFormControlElement(const PassRefPtr<HTMLFormControlElement>& elem) + : WebElement(elem) +{ +} + +WebFormControlElement& WebFormControlElement::operator=(const PassRefPtr<HTMLFormControlElement>& elem) +{ + m_private = elem; + return *this; +} + +WebFormControlElement::operator PassRefPtr<HTMLFormControlElement>() const +{ + return static_cast<HTMLFormControlElement*>(m_private.get()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebFormElement.cpp b/WebKit/chromium/src/WebFormElement.cpp index 5471608..7a01053 100644 --- a/WebKit/chromium/src/WebFormElement.cpp +++ b/WebKit/chromium/src/WebFormElement.cpp @@ -31,10 +31,13 @@ #include "config.h" #include "WebFormElement.h" +#include "FormState.h" #include "HTMLFormControlElement.h" #include "HTMLFormElement.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "WebFormControlElement.h" +#include "WebInputElement.h" #include "WebString.h" #include "WebURL.h" #include <wtf/PassRefPtr.h> @@ -43,25 +46,6 @@ using namespace WebCore; namespace WebKit { -class WebFormPrivate : public HTMLFormElement { -}; - -WebFormElement::WebFormElement(const WTF::PassRefPtr<HTMLFormElement>& e) - : WebElement(e.releaseRef()) -{ -} - -WebFormElement& WebFormElement::operator=(const WTF::PassRefPtr<HTMLFormElement>& e) -{ - WebNode::assign(e.releaseRef()); - return *this; -} - -WebFormElement::operator WTF::PassRefPtr<WebCore::HTMLFormElement>() const -{ - return PassRefPtr<HTMLFormElement>(static_cast<HTMLFormElement*>(m_private)); -} - bool WebFormElement::autoComplete() const { return constUnwrap<HTMLFormElement>()->autoComplete(); @@ -72,16 +56,21 @@ WebString WebFormElement::action() const return constUnwrap<HTMLFormElement>()->action(); } -WebString WebFormElement::name() const +WebString WebFormElement::name() const { return constUnwrap<HTMLFormElement>()->name(); } -WebString WebFormElement::method() const +WebString WebFormElement::method() const { return constUnwrap<HTMLFormElement>()->method(); } - + +bool WebFormElement::wasUserSubmitted() const +{ + return constUnwrap<HTMLFormElement>()->wasUserSubmitted(); +} + void WebFormElement::submit() { unwrap<HTMLFormElement>()->submit(); @@ -94,17 +83,36 @@ void WebFormElement::getNamedElements(const WebString& name, unwrap<HTMLFormElement>()->getNamedElements(name, tempVector); result.assign(tempVector); } - -void WebFormElement::getInputElements(WebVector<WebInputElement>& result) const + +void WebFormElement::getFormControlElements(WebVector<WebFormControlElement>& result) const { const HTMLFormElement* form = constUnwrap<HTMLFormElement>(); - Vector<RefPtr<HTMLInputElement> > tempVector; - for (size_t i = 0; i < form->formElements.size(); i++) { - if (form->formElements[i]->hasLocalName(HTMLNames::inputTag)) - tempVector.append(static_cast<HTMLInputElement*>( - form->formElements[i])); + Vector<RefPtr<HTMLFormControlElement> > tempVector; + // FIXME: We should move the for-loop condition into a variable instead of + // re-evaluating size each time. Also, consider refactoring this code so that + // we don't call form->associatedElements() multiple times. + for (size_t i = 0; i < form->associatedElements().size(); i++) { + if (form->associatedElements()[i]->hasLocalName(HTMLNames::inputTag) + || form->associatedElements()[i]->hasLocalName(HTMLNames::selectTag)) + tempVector.append(form->associatedElements()[i]); } result.assign(tempVector); } +WebFormElement::WebFormElement(const PassRefPtr<HTMLFormElement>& e) + : WebElement(e) +{ +} + +WebFormElement& WebFormElement::operator=(const PassRefPtr<HTMLFormElement>& e) +{ + m_private = e; + return *this; +} + +WebFormElement::operator PassRefPtr<HTMLFormElement>() const +{ + return static_cast<HTMLFormElement*>(m_private.get()); +} + } // namespace WebKit diff --git a/WebKit/chromium/src/WebFrameImpl.cpp b/WebKit/chromium/src/WebFrameImpl.cpp index 2f911f1..4422e1b 100644 --- a/WebKit/chromium/src/WebFrameImpl.cpp +++ b/WebKit/chromium/src/WebFrameImpl.cpp @@ -71,25 +71,25 @@ #include "config.h" #include "WebFrameImpl.h" +#include "AssociatedURLLoader.h" #include "Chrome.h" #include "ChromiumBridge.h" #include "ClipboardUtilitiesChromium.h" #include "Console.h" +#include "DOMUtilitiesPrivate.h" +#include "DOMWindow.h" #include "Document.h" #include "DocumentFragment.h" // Only needed for ReplaceSelectionCommand.h :( #include "DocumentLoader.h" #include "DocumentMarker.h" -#include "DOMUtilitiesPrivate.h" -#include "DOMWindow.h" #include "Editor.h" #include "EventHandler.h" #include "FormState.h" -#include "FrameLoader.h" #include "FrameLoadRequest.h" +#include "FrameLoader.h" #include "FrameTree.h" #include "FrameView.h" #include "GraphicsContext.h" -#include "HistoryItem.h" #include "HTMLCollection.h" #include "HTMLFormElement.h" #include "HTMLFrameOwnerElement.h" @@ -97,10 +97,12 @@ #include "HTMLInputElement.h" #include "HTMLLinkElement.h" #include "HTMLNames.h" +#include "HistoryItem.h" #include "InspectorController.h" -#include "markup.h" #include "Page.h" +#include "Performance.h" #include "PlatformContextSkia.h" +#include "PluginDocument.h" #include "PrintContext.h" #include "RenderFrame.h" #include "RenderTreeAsText.h" @@ -109,11 +111,12 @@ #include "ReplaceSelectionCommand.h" #include "ResourceHandle.h" #include "ResourceRequest.h" +#include "SVGSMILElement.h" #include "ScriptController.h" #include "ScriptSourceCode.h" #include "ScriptValue.h" -#include "ScrollbarTheme.h" #include "ScrollTypes.h" +#include "ScrollbarTheme.h" #include "SelectionController.h" #include "Settings.h" #include "SkiaUtils.h" @@ -130,6 +133,9 @@ #include "WebHistoryItem.h" #include "WebInputElement.h" #include "WebPasswordAutocompleteListener.h" +#include "WebPerformance.h" +#include "WebPlugin.h" +#include "WebPluginContainerImpl.h" #include "WebRange.h" #include "WebRect.h" #include "WebScriptSource.h" @@ -139,6 +145,7 @@ #include "WebVector.h" #include "WebViewImpl.h" #include "XPathResult.h" +#include "markup.h" #include <algorithm> #include <wtf/CurrentTime.h> @@ -148,7 +155,7 @@ #include "LocalCurrentGraphicsContext.h" #endif -#if OS(LINUX) +#if OS(LINUX) || OS(FREEBSD) #include <gdk/gdk.h> #endif @@ -231,6 +238,15 @@ static void frameContentAsPlainText(size_t maxChars, Frame* frame, // Recursively walk the children. FrameTree* frameTree = frame->tree(); for (Frame* curChild = frameTree->firstChild(); curChild; curChild = curChild->tree()->nextSibling()) { + // Ignore the text of non-visible frames. + RenderView* contentRenderer = curChild->contentRenderer(); + RenderPart* ownerRenderer = curChild->ownerRenderer(); + if (!contentRenderer || !contentRenderer->width() || !contentRenderer->height() + || (contentRenderer->x() + contentRenderer->width() <= 0) || (contentRenderer->y() + contentRenderer->height() <= 0) + || (ownerRenderer && ownerRenderer->style() && ownerRenderer->style()->visibility() != VISIBLE)) { + continue; + } + // Make sure the frame separator won't fill up the buffer, and give up if // it will. The danger is if the separator will make the buffer longer than // maxChars. This will cause the computation above: @@ -246,7 +262,24 @@ static void frameContentAsPlainText(size_t maxChars, Frame* frame, } } -// Simple class to override some of PrintContext behavior. +static long long generateFrameIdentifier() +{ + static long long next = 0; + return ++next; +} + +WebPluginContainerImpl* WebFrameImpl::pluginContainerFromFrame(Frame* frame) +{ + if (!frame) + return 0; + if (!frame->document() || !frame->document()->isPluginDocument()) + return 0; + PluginDocument* pluginDocument = static_cast<PluginDocument*>(frame->document()); + return static_cast<WebPluginContainerImpl *>(pluginDocument->pluginWidget()); +} + +// Simple class to override some of PrintContext behavior. Some of the methods +// made virtual so that they can be overriden by ChromePluginPrintContext. class ChromePrintContext : public PrintContext, public Noncopyable { public: ChromePrintContext(Frame* frame) @@ -255,28 +288,38 @@ public: { } - void begin(float width) + virtual void begin(float width, float height) { ASSERT(!m_printedPageWidth); m_printedPageWidth = width; - PrintContext::begin(m_printedPageWidth); + PrintContext::begin(m_printedPageWidth, height); + } + + virtual void end() + { + PrintContext::end(); } - float getPageShrink(int pageNumber) const + virtual float getPageShrink(int pageNumber) const { IntRect pageRect = m_pageRects[pageNumber]; return m_printedPageWidth / pageRect.width(); } - // Spools the printed page, a subrect of m_frame. Skip the scale step. + // Spools the printed page, a subrect of m_frame. Skip the scale step. // NativeTheme doesn't play well with scaling. Scaling is done browser side - // instead. Returns the scale to be applied. - float spoolPage(GraphicsContext& ctx, int pageNumber) + // instead. Returns the scale to be applied. + // On Linux, we don't have the problem with NativeTheme, hence we let WebKit + // do the scaling and ignore the return value. + virtual float spoolPage(GraphicsContext& ctx, int pageNumber) { IntRect pageRect = m_pageRects[pageNumber]; float scale = m_printedPageWidth / pageRect.width(); ctx.save(); +#if OS(LINUX) || OS(FREEBSD) + ctx.scale(WebCore::FloatSize(scale, scale)); +#endif ctx.translate(static_cast<float>(-pageRect.x()), static_cast<float>(-pageRect.y())); ctx.clip(pageRect); @@ -285,11 +328,95 @@ public: return scale; } + virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight) + { + return PrintContext::computePageRects(printRect, headerHeight, footerHeight, userScaleFactor, outPageHeight); + } + + virtual int pageCount() const + { + return PrintContext::pageCount(); + } + + virtual bool shouldUseBrowserOverlays() const + { + return true; + } + private: // Set when printing. float m_printedPageWidth; }; +// Simple class to override some of PrintContext behavior. This is used when +// the frame hosts a plugin that supports custom printing. In this case, we +// want to delegate all printing related calls to the plugin. +class ChromePluginPrintContext : public ChromePrintContext { +public: + ChromePluginPrintContext(Frame* frame, int printerDPI) + : ChromePrintContext(frame), m_pageCount(0), m_printerDPI(printerDPI) + { + // This HAS to be a frame hosting a full-mode plugin + ASSERT(frame->document()->isPluginDocument()); + } + + virtual void begin(float width) + { + } + + virtual void end() + { + WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame); + if (pluginContainer && pluginContainer->supportsPaginatedPrint()) + pluginContainer->printEnd(); + else + ASSERT_NOT_REACHED(); + } + + virtual float getPageShrink(int pageNumber) const + { + // We don't shrink the page (maybe we should ask the widget ??) + return 1.0; + } + + virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight) + { + WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame); + if (pluginContainer && pluginContainer->supportsPaginatedPrint()) + m_pageCount = pluginContainer->printBegin(IntRect(printRect), m_printerDPI); + else + ASSERT_NOT_REACHED(); + } + + virtual int pageCount() const + { + return m_pageCount; + } + + // Spools the printed page, a subrect of m_frame. Skip the scale step. + // NativeTheme doesn't play well with scaling. Scaling is done browser side + // instead. Returns the scale to be applied. + virtual float spoolPage(GraphicsContext& ctx, int pageNumber) + { + WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame); + if (pluginContainer && pluginContainer->supportsPaginatedPrint()) + pluginContainer->printPage(pageNumber, &ctx); + else + ASSERT_NOT_REACHED(); + return 1.0; + } + + virtual bool shouldUseBrowserOverlays() const + { + return false; + } + +private: + // Set when printing. + int m_pageCount; + int m_printerDPI; +}; + static WebDataSource* DataSourceForDocLoader(DocumentLoader* loader) { return loader ? WebDataSourceImpl::fromDocumentLoader(loader) : 0; @@ -360,12 +487,17 @@ WebFrame* WebFrame::fromFrameOwnerElement(const WebElement& element) WebString WebFrameImpl::name() const { - return m_frame->tree()->name(); + return m_frame->tree()->uniqueName(); +} + +void WebFrameImpl::setName(const WebString& name) +{ + m_frame->tree()->setName(name); } -void WebFrameImpl::clearName() +long long WebFrameImpl::identifier() const { - m_frame->tree()->clearName(); + return m_identifier; } WebURL WebFrameImpl::url() const @@ -413,7 +545,7 @@ WebURL WebFrameImpl::openSearchDescriptionURL() const WebString WebFrameImpl::encoding() const { - return frame()->loader()->encoding(); + return frame()->loader()->writer()->encoding(); } WebSize WebFrameImpl::scrollOffset() const @@ -433,7 +565,7 @@ WebSize WebFrameImpl::contentsSize() const int WebFrameImpl::contentsPreferredWidth() const { if (m_frame->document() && m_frame->document()->renderView()) - return m_frame->document()->renderView()->minPrefWidth(); + return m_frame->document()->renderView()->minPreferredLogicalWidth(); return 0; } @@ -553,13 +685,18 @@ void WebFrameImpl::forms(WebVector<WebFormElement>& results) const return; RefPtr<HTMLCollection> forms = m_frame->document()->forms(); - size_t formCount = forms->length(); + size_t formCount = 0; + for (size_t i = 0; i < forms->length(); ++i) { + Node* node = forms->item(i); + if (node && node->isHTMLElement()) + ++formCount; + } WebVector<WebFormElement> temp(formCount); for (size_t i = 0; i < formCount; ++i) { Node* node = forms->item(i); // Strange but true, sometimes item can be 0. - if (node) + if (node && node->isHTMLElement()) temp[i] = static_cast<HTMLFormElement*>(node); } results.swap(temp); @@ -570,6 +707,14 @@ WebAnimationController* WebFrameImpl::animationController() return &m_animationController; } +WebPerformance WebFrameImpl::performance() const +{ + if (!m_frame || !m_frame->domWindow()) + return WebPerformance(); + + return WebPerformance(m_frame->domWindow()->webkitPerformance()); +} + WebSecurityOrigin WebFrameImpl::securityOrigin() const { if (!m_frame || !m_frame->document()) @@ -596,7 +741,7 @@ NPObject* WebFrameImpl::windowObject() const void WebFrameImpl::bindToWindowObject(const WebString& name, NPObject* object) { ASSERT(m_frame); - if (!m_frame || !m_frame->script()->canExecuteScripts()) + if (!m_frame || !m_frame->script()->canExecuteScripts(NotAboutToExecuteScript)) return; String key = name; @@ -609,8 +754,9 @@ void WebFrameImpl::bindToWindowObject(const WebString& name, NPObject* object) void WebFrameImpl::executeScript(const WebScriptSource& source) { + TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::base()); m_frame->script()->executeScript( - ScriptSourceCode(source.code, source.url, source.startLine)); + ScriptSourceCode(source.code, source.url, position)); } void WebFrameImpl::executeScriptInIsolatedWorld( @@ -620,8 +766,9 @@ void WebFrameImpl::executeScriptInIsolatedWorld( Vector<ScriptSourceCode> sources; for (unsigned i = 0; i < numSources; ++i) { + TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(sourcesIn[i].startLine), WTF::OneBasedNumber::base()); sources.append(ScriptSourceCode( - sourcesIn[i].code, sourcesIn[i].url, sourcesIn[i].startLine)); + sourcesIn[i].code, sourcesIn[i].url, position)); } m_frame->script()->evaluateInIsolatedWorld(worldId, sources, extensionGroup); @@ -670,6 +817,14 @@ void WebFrameImpl::collectGarbage() } #if USE(V8) +v8::Handle<v8::Value> WebFrameImpl::executeScriptAndReturnValue( + const WebScriptSource& source) +{ + TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::base()); + return m_frame->script()->executeScript( + ScriptSourceCode(source.code, source.url, position)).v8Value(); +} + // Returns the V8 context for this frame, or an empty handle if there is none. v8::Local<v8::Context> WebFrameImpl::mainWorldScriptContext() const { @@ -694,7 +849,7 @@ bool WebFrameImpl::insertStyleText( if (!id.isEmpty()) { Element* oldElement = document->getElementById(id); if (oldElement) { - Node* parent = oldElement->parent(); + Node* parent = oldElement->parentNode(); if (!parent) return false; parent->removeChild(oldElement, err); @@ -713,12 +868,10 @@ bool WebFrameImpl::insertStyleText( return success; } -void WebFrameImpl::reload() +void WebFrameImpl::reload(bool ignoreCache) { m_frame->loader()->history()->saveDocumentAndScrollState(); - - stopLoading(); // Make sure existing activity stops. - m_frame->loader()->reload(); + m_frame->loader()->reload(ignoreCache); } void WebFrameImpl::loadRequest(const WebURLRequest& request) @@ -731,7 +884,6 @@ void WebFrameImpl::loadRequest(const WebURLRequest& request) return; } - stopLoading(); // Make sure existing activity stops. m_frame->loader()->load(resourceRequest, false); } @@ -740,8 +892,6 @@ void WebFrameImpl::loadHistoryItem(const WebHistoryItem& item) RefPtr<HistoryItem> historyItem = PassRefPtr<HistoryItem>(item); ASSERT(historyItem.get()); - stopLoading(); // Make sure existing activity stops. - // If there is no currentItem, which happens when we are navigating in // session history after a crash, we need to manufacture one otherwise WebKit // hoarks. This is probably the wrong thing to do, but it seems to work. @@ -778,8 +928,6 @@ void WebFrameImpl::loadData(const WebData& data, request = m_frame->loader()->originalRequest(); request.setURL(baseURL); - stopLoading(); // Make sure existing activity stops. - m_frame->loader()->load(request, substData, false); if (replace) { // Do this to force WebKit to treat the load as replacing the currently @@ -842,12 +990,17 @@ WebHistoryItem WebFrameImpl::previousHistoryItem() const // only get saved to history when it becomes the previous item. The caller // is expected to query the history item after a navigation occurs, after // the desired history item has become the previous entry. - return WebHistoryItem(viewImpl()->previousHistoryItem()); + return WebHistoryItem(m_frame->loader()->history()->previousItem()); } WebHistoryItem WebFrameImpl::currentHistoryItem() const { - m_frame->loader()->history()->saveDocumentAndScrollState(); + // If we are still loading, then we don't want to clobber the current + // history item as this could cause us to lose the scroll position and + // document state. However, it is OK for new navigations. + if (m_frame->loader()->loadType() == FrameLoadTypeStandard + || !m_frame->loader()->activeDocumentLoader()->isLoadingInAPISense()) + m_frame->loader()->history()->saveDocumentAndScrollState(); return WebHistoryItem(m_frame->page()->backForwardList()->currentItem()); } @@ -885,22 +1038,14 @@ void WebFrameImpl::dispatchWillSendRequest(WebURLRequest& request) 0, 0, request.toMutableResourceRequest(), response); } -void WebFrameImpl::commitDocumentData(const char* data, size_t dataLen) +WebURLLoader* WebFrameImpl::createAssociatedURLLoader() { - DocumentLoader* documentLoader = m_frame->loader()->documentLoader(); - - // Set the text encoding. This calls begin() for us. It is safe to call - // this multiple times (Mac does: page/mac/WebCoreFrameBridge.mm). - bool userChosen = true; - String encoding = documentLoader->overrideEncoding(); - if (encoding.isNull()) { - userChosen = false; - encoding = documentLoader->response().textEncodingName(); - } - m_frame->loader()->setEncoding(encoding, userChosen); + return new AssociatedURLLoader(this); +} - // NOTE: mac only does this if there is a document - m_frame->loader()->addData(data, dataLen); +void WebFrameImpl::commitDocumentData(const char* data, size_t length) +{ + m_frame->loader()->documentLoader()->commitData(data, length); } unsigned WebFrameImpl::unloadListenerCount() const @@ -957,6 +1102,22 @@ WebRange WebFrameImpl::markedRange() const return frame()->editor()->compositionRange(); } +bool WebFrameImpl::firstRectForCharacterRange(unsigned location, unsigned length, WebRect& rect) const +{ + if ((location + length < location) && (location + length)) + length = 0; + + Element* selectionRoot = frame()->selection()->rootEditableElement(); + Element* scope = selectionRoot ? selectionRoot : frame()->document()->documentElement(); + RefPtr<Range> range = TextIterator::rangeFromLocationAndLength(scope, location, length); + if (!range) + return false; + IntRect intRect = frame()->editor()->firstRectForRange(range.get()); + rect = WebRect(intRect.x(), intRect.y(), intRect.width(), intRect.height()); + + return true; +} + bool WebFrameImpl::executeCommand(const WebString& name) { ASSERT(frame()); @@ -975,17 +1136,25 @@ bool WebFrameImpl::executeCommand(const WebString& name) if (command[command.length() - 1] == UChar(':')) command = command.substring(0, command.length() - 1); + if (command == "Copy") { + WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame()); + if (pluginContainer) { + pluginContainer->copy(); + return true; + } + } + bool rv = true; // Specially handling commands that Editor::execCommand does not directly // support. if (command == "DeleteToEndOfParagraph") { Editor* editor = frame()->editor(); - if (!editor->deleteWithDirection(SelectionController::FORWARD, + if (!editor->deleteWithDirection(SelectionController::DirectionForward, ParagraphBoundary, true, false)) { - editor->deleteWithDirection(SelectionController::FORWARD, + editor->deleteWithDirection(SelectionController::DirectionForward, CharacterGranularity, true, false); @@ -1045,6 +1214,10 @@ bool WebFrameImpl::isContinuousSpellCheckingEnabled() const bool WebFrameImpl::hasSelection() const { + WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame()); + if (pluginContainer) + return pluginContainer->plugin()->hasSelection(); + // frame()->selection()->isNone() never returns true. return (frame()->selection()->start() != frame()->selection()->end()); } @@ -1056,6 +1229,10 @@ WebRange WebFrameImpl::selectionRange() const WebString WebFrameImpl::selectionAsText() const { + WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame()); + if (pluginContainer) + return pluginContainer->plugin()->selectionAsText(); + RefPtr<Range> range = frame()->selection()->toNormalizedRange(); if (!range.get()) return WebString(); @@ -1070,6 +1247,10 @@ WebString WebFrameImpl::selectionAsText() const WebString WebFrameImpl::selectionAsMarkup() const { + WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame()); + if (pluginContainer) + return pluginContainer->plugin()->selectionAsMarkup(); + RefPtr<Range> range = frame()->selection()->toNormalizedRange(); if (!range.get()) return WebString(); @@ -1082,11 +1263,10 @@ void WebFrameImpl::selectWordAroundPosition(Frame* frame, VisiblePosition pos) VisibleSelection selection(pos); selection.expandUsingGranularity(WordGranularity); - if (selection.isRange()) - frame->setSelectionGranularity(WordGranularity); - - if (frame->shouldChangeSelection(selection)) - frame->selection()->setSelection(selection); + if (frame->selection()->shouldChangeSelection(selection)) { + TextGranularity granularity = selection.isRange() ? WordGranularity : CharacterGranularity; + frame->selection()->setSelection(selection, granularity); + } } bool WebFrameImpl::selectWordAroundCaret() @@ -1099,18 +1279,27 @@ bool WebFrameImpl::selectWordAroundCaret() return true; } -int WebFrameImpl::printBegin(const WebSize& pageSize) +int WebFrameImpl::printBegin(const WebSize& pageSize, int printerDPI, bool *useBrowserOverlays) { ASSERT(!frame()->document()->isFrameSet()); + // If this is a plugin document, check if the plugin supports its own + // printing. If it does, we will delegate all printing to that. + WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame()); + if (pluginContainer && pluginContainer->supportsPaginatedPrint()) + m_printContext.set(new ChromePluginPrintContext(frame(), printerDPI)); + else + m_printContext.set(new ChromePrintContext(frame())); - m_printContext.set(new ChromePrintContext(frame())); FloatRect rect(0, 0, static_cast<float>(pageSize.width), static_cast<float>(pageSize.height)); - m_printContext->begin(rect.width()); + m_printContext->begin(rect.width(), rect.height()); float pageHeight; // We ignore the overlays calculation for now since they are generated in the // browser. pageHeight is actually an output parameter. m_printContext->computePageRects(rect, 0, 0, 1.0, pageHeight); + if (useBrowserOverlays) + *useBrowserOverlays = m_printContext->shouldUseBrowserOverlays(); + return m_printContext->pageCount(); } @@ -1133,7 +1322,7 @@ float WebFrameImpl::printPage(int page, WebCanvas* canvas) return 0; } -#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) +#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) || OS(SOLARIS) PlatformContextSkia context(canvas); GraphicsContext spool(&context); #elif OS(DARWIN) @@ -1152,6 +1341,28 @@ void WebFrameImpl::printEnd() m_printContext.clear(); } +bool WebFrameImpl::isPageBoxVisible(int pageIndex) +{ + return frame()->document()->isPageBoxVisible(pageIndex); +} + +void WebFrameImpl::pageSizeAndMarginsInPixels(int pageIndex, + WebSize& pageSize, + int& marginTop, + int& marginRight, + int& marginBottom, + int& marginLeft) +{ + IntSize size(pageSize.width, pageSize.height); + frame()->document()->pageSizeAndMarginsInPixels(pageIndex, + size, + marginTop, + marginRight, + marginBottom, + marginLeft); + pageSize = size; +} + bool WebFrameImpl::find(int identifier, const WebString& searchText, const WebFindOptions& options, @@ -1163,7 +1374,7 @@ bool WebFrameImpl::find(int identifier, if (!options.findNext) frame()->page()->unmarkAllTextMatches(); else - setMarkerActive(m_activeMatch.get(), false); // Active match is changing. + setMarkerActive(m_activeMatch.get(), false); // Active match is changing. // Starts the search from the current selection. bool startInSelection = true; @@ -1179,7 +1390,7 @@ bool WebFrameImpl::find(int identifier, } ASSERT(frame() && frame()->view()); - bool found = frame()->findString( + bool found = frame()->editor()->findString( searchText, options.forward, options.matchCase, wrapWithinFrame, startInSelection); if (found) { @@ -1203,11 +1414,14 @@ bool WebFrameImpl::find(int identifier, else { m_activeMatch = newSelection.toNormalizedRange(); currSelectionRect = m_activeMatch->boundingBox(); - setMarkerActive(m_activeMatch.get(), true); // Active. + setMarkerActive(m_activeMatch.get(), true); // Active. // WebKit draws the highlighting for all matches. executeCommand(WebString::fromUTF8("Unselect")); } + // Make sure no node is focused. See http://crbug.com/38700. + frame()->document()->setFocusedNode(0); + if (!options.findNext || activeSelection) { // This is either a Find operation or a Find-next from a new start point // due to a selection, so we set the flag to ask the scoping effort @@ -1258,8 +1472,8 @@ void WebFrameImpl::stopFinding(bool clearSelection) cancelPendingScopingEffort(); // Remove all markers for matches found and turn off the highlighting. - frame()->document()->removeMarkers(DocumentMarker::TextMatch); - frame()->setMarkedTextMatchesAreHighlighted(false); + frame()->document()->markers()->removeMarkers(DocumentMarker::TextMatch); + frame()->editor()->setMarkedTextMatchesAreHighlighted(false); // Let the frame know that we don't want tickmarks or highlighting anymore. invalidateArea(InvalidateAll); @@ -1280,7 +1494,7 @@ void WebFrameImpl::scopeStringMatches(int identifier, // Scoping is just about to begin. m_scopingComplete = false; // Clear highlighting for this frame. - if (frame()->markedTextMatchesAreHighlighted()) + if (frame()->editor()->markedTextMatchesAreHighlighted()) frame()->page()->unmarkAllTextMatches(); // Clear the counters from last operation. m_lastMatchCount = 0; @@ -1295,7 +1509,7 @@ void WebFrameImpl::scopeStringMatches(int identifier, identifier, searchText, options, - false); // false=we just reset, so don't do it again. + false); // false=we just reset, so don't do it again. return; } @@ -1309,7 +1523,7 @@ void WebFrameImpl::scopeStringMatches(int identifier, m_resumeScopingFromRange->startOffset(ec2) + 1, ec); if (ec || ec2) { - if (ec2) // A non-zero |ec| happens when navigating during search. + if (ec2) // A non-zero |ec| happens when navigating during search. ASSERT_NOT_REACHED(); return; } @@ -1318,7 +1532,7 @@ void WebFrameImpl::scopeStringMatches(int identifier, // This timeout controls how long we scope before releasing control. This // value does not prevent us from running for longer than this, but it is // periodically checked to see if we have exceeded our allocated time. - const double maxScopingDuration = 0.1; // seconds + const double maxScopingDuration = 0.1; // seconds int matchCount = 0; bool timedOut = false; @@ -1405,7 +1619,7 @@ void WebFrameImpl::scopeStringMatches(int identifier, m_lastSearchString = searchText; if (matchCount > 0) { - frame()->setMarkedTextMatchesAreHighlighted(true); + frame()->editor()->setMarkedTextMatchesAreHighlighted(true); m_lastMatchCount += matchCount; @@ -1425,8 +1639,8 @@ void WebFrameImpl::scopeStringMatches(int identifier, identifier, searchText, options, - false); // don't reset. - return; // Done for now, resume work later. + false); // don't reset. + return; // Done for now, resume work later. } // This frame has no further scoping left, so it is done. Other frames might, @@ -1478,14 +1692,6 @@ void WebFrameImpl::resetMatchCount() m_framesScopingCount = 0; } -WebURL WebFrameImpl::completeURL(const WebString& url) const -{ - if (!m_frame || !m_frame->document()) - return WebURL(); - - return m_frame->document()->completeURL(url); -} - WebString WebFrameImpl::contentAsText(size_t maxChars) const { if (!m_frame) @@ -1518,6 +1724,11 @@ WebString WebFrameImpl::counterValueForElementById(const WebString& id) const return counterValueForElement(element); } +WebString WebFrameImpl::markerTextForListItem(const WebElement& webElement) const +{ + return WebCore::markerTextForListItem(const_cast<Element*>(webElement.constUnwrap<Element>())); +} + int WebFrameImpl::pageNumberForElementById(const WebString& id, float pageWidthInPixels, float pageHeightInPixels) const @@ -1533,6 +1744,48 @@ int WebFrameImpl::pageNumberForElementById(const WebString& id, return PrintContext::pageNumberForElement(element, pageSize); } +WebRect WebFrameImpl::selectionBoundsRect() const +{ + if (hasSelection()) + return IntRect(frame()->selection()->bounds(false)); + + return WebRect(); +} + +bool WebFrameImpl::selectionStartHasSpellingMarkerFor(int from, int length) const +{ + if (!m_frame) + return false; + return m_frame->editor()->selectionStartHasSpellingMarkerFor(from, length); +} + +bool WebFrameImpl::pauseSVGAnimation(const WebString& animationId, double time, const WebString& elementId) +{ +#if !ENABLE(SVG) + return false; +#else + if (!m_frame) + return false; + + Document* document = m_frame->document(); + if (!document || !document->svgExtensions()) + return false; + + Node* coreNode = document->getElementById(animationId); + if (!coreNode || !SVGSMILElement::isSMILElement(coreNode)) + return false; + + return document->accessSVGExtensions()->sampleAnimationAtTime(elementId, static_cast<SVGSMILElement*>(coreNode), time); +#endif +} + +WebString WebFrameImpl::layerTreeAsText() const +{ + if (!m_frame) + return WebString(); + return WebString(m_frame->layerTreeAsText()); +} + // WebFrameImpl public --------------------------------------------------------- PassRefPtr<WebFrameImpl> WebFrameImpl::create(WebFrameClient* client) @@ -1553,6 +1806,7 @@ WebFrameImpl::WebFrameImpl(WebFrameClient* client) , m_scopingComplete(false) , m_nextInvalidateAfter(0) , m_animationController(this) + , m_identifier(generateFrameIdentifier()) { ChromiumBridge::incrementStatsCounter(webFrameActiveCount); frameCount++; @@ -1608,7 +1862,7 @@ PassRefPtr<Frame> WebFrameImpl::createChildFrame( // it is necessary to check the value after calling init() and // return without loading URL. // (b:791612) - childFrame->init(); // create an empty document + childFrame->init(); // create an empty document if (!childFrame->tree()->parent()) return 0; @@ -1631,14 +1885,26 @@ void WebFrameImpl::layout() // layout this frame FrameView* view = m_frame->view(); if (view) - view->layoutIfNeededRecursive(); + view->updateLayoutAndStyleIfNeededRecursive(); +} + +void WebFrameImpl::paintWithContext(GraphicsContext& gc, const WebRect& rect) +{ + IntRect dirtyRect(rect); + gc.save(); + if (m_frame->document() && frameView()) { + gc.clip(dirtyRect); + frameView()->paint(&gc, dirtyRect); + m_frame->page()->inspectorController()->drawNodeHighlight(gc); + } else + gc.fillRect(dirtyRect, Color::white, ColorSpaceDeviceRGB); + gc.restore(); } void WebFrameImpl::paint(WebCanvas* canvas, const WebRect& rect) { if (rect.isEmpty()) return; - IntRect dirtyRect(rect); #if WEBKIT_USING_CG GraphicsContext gc(canvas); LocalCurrentGraphicsContext localContext(&gc); @@ -1650,14 +1916,7 @@ void WebFrameImpl::paint(WebCanvas* canvas, const WebRect& rect) #else notImplemented(); #endif - gc.save(); - if (m_frame->document() && frameView()) { - gc.clip(dirtyRect); - frameView()->paint(&gc, dirtyRect); - m_frame->page()->inspectorController()->drawNodeHighlight(gc); - } else - gc.fillRect(dirtyRect, Color::white, DeviceColorSpace); - gc.restore(); + paintWithContext(gc, rect); } void WebFrameImpl::createFrameView() @@ -1719,7 +1978,7 @@ WebFrameImpl* WebFrameImpl::fromFrameOwnerElement(Element* element) static_cast<HTMLFrameOwnerElement*>(element); return fromFrame(frameElement->contentFrame()); } - + WebViewImpl* WebFrameImpl::viewImpl() const { if (!m_frame) @@ -1753,7 +2012,7 @@ void WebFrameImpl::setFindEndstateFocusAndSelection() // example, focus links if we have found text within the link. Node* node = m_activeMatch->firstNode(); while (node && !node->isFocusable() && node != frame()->document()) - node = node->parent(); + node = node->parentNode(); if (node && node != frame()->document()) { // Found a focusable parent node. Set focus to it. @@ -1794,24 +2053,38 @@ void WebFrameImpl::didFail(const ResourceError& error, bool wasProvisional) client()->didFailLoad(this, webError); } -void WebFrameImpl::setAllowsScrolling(bool flag) +void WebFrameImpl::setCanHaveScrollbars(bool canHaveScrollbars) { - m_frame->view()->setCanHaveScrollbars(flag); + m_frame->view()->setCanHaveScrollbars(canHaveScrollbars); } -void WebFrameImpl::registerPasswordListener( +bool WebFrameImpl::registerPasswordListener( WebInputElement inputElement, WebPasswordAutocompleteListener* listener) { - RefPtr<HTMLInputElement> element = inputElement.operator PassRefPtr<HTMLInputElement>(); - ASSERT(m_passwordListeners.find(element) == m_passwordListeners.end()); - m_passwordListeners.set(element, listener); + RefPtr<HTMLInputElement> element(inputElement.unwrap<HTMLInputElement>()); + if (!m_passwordListeners.add(element, listener).second) { + delete listener; + return false; + } + return true; +} + +void WebFrameImpl::notifiyPasswordListenerOfAutocomplete( + const WebInputElement& inputElement) +{ + const HTMLInputElement* element = inputElement.constUnwrap<HTMLInputElement>(); + WebPasswordAutocompleteListener* listener = getPasswordListener(element); + // Password listeners need to autocomplete other fields that depend on the + // input element with autofill suggestions. + if (listener) + listener->performInlineAutocomplete(element->value(), false, false); } WebPasswordAutocompleteListener* WebFrameImpl::getPasswordListener( - HTMLInputElement* inputElement) + const HTMLInputElement* inputElement) { - return m_passwordListeners.get(RefPtr<HTMLInputElement>(inputElement)); + return m_passwordListeners.get(RefPtr<HTMLInputElement>(const_cast<HTMLInputElement*>(inputElement))); } // WebFrameImpl private -------------------------------------------------------- @@ -1832,6 +2105,8 @@ void WebFrameImpl::invalidateArea(AreaToInvalidate area) if ((area & InvalidateContentArea) == InvalidateContentArea) { IntRect contentArea( view->x(), view->y(), view->visibleWidth(), view->visibleHeight()); + IntRect frameRect = view->frameRect(); + contentArea.move(-frameRect.topLeft().x(), -frameRect.topLeft().y()); view->invalidateRect(contentArea); } @@ -1841,6 +2116,8 @@ void WebFrameImpl::invalidateArea(AreaToInvalidate area) view->x() + view->visibleWidth(), view->y(), ScrollbarTheme::nativeTheme()->scrollbarThickness(), view->visibleHeight()); + IntRect frameRect = view->frameRect(); + scrollBarVert.move(-frameRect.topLeft().x(), -frameRect.topLeft().y()); view->invalidateRect(scrollBarVert); } } @@ -1866,14 +2143,14 @@ void WebFrameImpl::addMarker(Range* range, bool activeMatch) if (marker.endOffset > marker.startOffset) { // Find the node to add a marker to and add it. Node* node = textPiece->startContainer(exception); - frame()->document()->addMarker(node, marker); + frame()->document()->markers()->addMarker(node, marker); // Rendered rects for markers in WebKit are not populated until each time // the markers are painted. However, we need it to happen sooner, because // the whole purpose of tickmarks on the scrollbar is to show where // matches off-screen are (that haven't been painted yet). - Vector<DocumentMarker> markers = frame()->document()->markersForNode(node); - frame()->document()->setRenderedRectForMarker( + Vector<DocumentMarker> markers = frame()->document()->markers()->markersForNode(node); + frame()->document()->markers()->setRenderedRectForMarker( textPiece->startContainer(exception), markers[markers.size() - 1], range->boundingBox()); @@ -1883,10 +2160,11 @@ void WebFrameImpl::addMarker(Range* range, bool activeMatch) void WebFrameImpl::setMarkerActive(Range* range, bool active) { - if (!range) + WebCore::ExceptionCode ec; + if (!range || range->collapsed(ec)) return; - frame()->document()->setMarkersActive(range, active); + frame()->document()->markers()->setMarkersActive(range, active); } int WebFrameImpl::ordinalOfFirstMatchForFrame(WebFrameImpl* frame) const @@ -1906,9 +2184,9 @@ int WebFrameImpl::ordinalOfFirstMatchForFrame(WebFrameImpl* frame) const bool WebFrameImpl::shouldScopeMatches(const String& searchText) { - // Don't scope if we can't find a frame or if the frame is not visible. + // Don't scope if we can't find a frame or a view or if the frame is not visible. // The user may have closed the tab/application, so abort. - if (!frame() || !hasVisibleContent()) + if (!frame() || !frame()->view() || !hasVisibleContent()) return false; ASSERT(frame()->document() && frame()->view()); @@ -1922,7 +2200,7 @@ bool WebFrameImpl::shouldScopeMatches(const String& searchText) searchText.substring(0, m_lastSearchString.length()); if (previousSearchPrefix == m_lastSearchString) - return false; // Don't search this frame, it will be fruitless. + return false; // Don't search this frame, it will be fruitless. } return true; @@ -1974,12 +2252,13 @@ void WebFrameImpl::clearPasswordListeners() void WebFrameImpl::loadJavaScriptURL(const KURL& url) { - // This is copied from FrameLoader::executeIfJavaScriptURL. Unfortunately, - // we cannot just use that method since it is private, and it also doesn't - // quite behave as we require it to for bookmarklets. The key difference is - // that we need to suppress loading the string result from evaluating the JS - // URL if executing the JS URL resulted in a location change. We also allow - // a JS URL to be loaded even if scripts on the page are otherwise disabled. + // This is copied from ScriptController::executeIfJavaScriptURL. + // Unfortunately, we cannot just use that method since it is private, and + // it also doesn't quite behave as we require it to for bookmarklets. The + // key difference is that we need to suppress loading the string result + // from evaluating the JS URL if executing the JS URL resulted in a + // location change. We also allow a JS URL to be loaded even if scripts on + // the page are otherwise disabled. if (!m_frame->document() || !m_frame->page()) return; @@ -1991,14 +2270,8 @@ void WebFrameImpl::loadJavaScriptURL(const KURL& url) if (!result.getString(scriptResult)) return; - SecurityOrigin* securityOrigin = m_frame->document()->securityOrigin(); - - if (!m_frame->redirectScheduler()->locationChangePending()) { - m_frame->loader()->stopAllLoaders(); - m_frame->loader()->begin(m_frame->loader()->url(), true, securityOrigin); - m_frame->loader()->write(scriptResult); - m_frame->loader()->end(); - } + if (!m_frame->navigationScheduler()->locationChangePending()) + m_frame->loader()->writer()->replaceDocument(scriptResult); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebFrameImpl.h b/WebKit/chromium/src/WebFrameImpl.h index ccba6d4..52d9db4 100644 --- a/WebKit/chromium/src/WebFrameImpl.h +++ b/WebKit/chromium/src/WebFrameImpl.h @@ -31,17 +31,17 @@ #ifndef WebFrameImpl_h #define WebFrameImpl_h -// FIXME: remove this relative path once consumers from glue are removed. -#include "../public/WebFrame.h" +#include "WebAnimationControllerImpl.h" +#include "WebFrame.h" + #include "Frame.h" #include "FrameLoaderClientImpl.h" #include "PlatformString.h" #include <wtf/OwnPtr.h> #include <wtf/RefCounted.h> -#include "WebAnimationControllerImpl.h" - namespace WebCore { +class GraphicsContext; class HistoryItem; class KURL; class Node; @@ -56,6 +56,8 @@ class WebDataSourceImpl; class WebInputElement; class WebFrameClient; class WebPasswordAutocompleteListener; +class WebPerformance; +class WebPluginContainerImpl; class WebView; class WebViewImpl; @@ -64,7 +66,8 @@ class WebFrameImpl : public WebFrame, public RefCounted<WebFrameImpl> { public: // WebFrame methods: virtual WebString name() const; - virtual void clearName(); + virtual void setName(const WebString&); + virtual long long identifier() const; virtual WebURL url() const; virtual WebURL favIconURL() const; virtual WebURL openSearchDescriptionURL() const; @@ -88,7 +91,8 @@ public: virtual WebFrame* findChildByExpression(const WebString&) const; virtual WebDocument document() const; virtual void forms(WebVector<WebFormElement>&) const; - virtual WebAnimationController* animationController(); + virtual WebAnimationController* animationController(); + virtual WebPerformance performance() const; virtual WebSecurityOrigin securityOrigin() const; virtual void grantUniversalAccess(); virtual NPObject* windowObject() const; @@ -100,10 +104,12 @@ public: virtual void addMessageToConsole(const WebConsoleMessage&); virtual void collectGarbage(); #if WEBKIT_USING_V8 + virtual v8::Handle<v8::Value> executeScriptAndReturnValue( + const WebScriptSource&); virtual v8::Local<v8::Context> mainWorldScriptContext() const; #endif virtual bool insertStyleText(const WebString& css, const WebString& id); - virtual void reload(); + virtual void reload(bool ignoreCache); virtual void loadRequest(const WebURLRequest&); virtual void loadHistoryItem(const WebHistoryItem&); virtual void loadData( @@ -122,6 +128,7 @@ public: virtual bool isViewSourceModeEnabled() const; virtual void setReferrerForRequest(WebURLRequest&, const WebURL& referrer); virtual void dispatchWillSendRequest(WebURLRequest&); + virtual WebURLLoader* createAssociatedURLLoader(); virtual void commitDocumentData(const char* data, size_t length); virtual unsigned unloadListenerCount() const; virtual bool isProcessingUserGesture() const; @@ -132,6 +139,7 @@ public: virtual void unmarkText(); virtual bool hasMarkedText() const; virtual WebRange markedRange() const; + virtual bool firstRectForCharacterRange(unsigned location, unsigned length, WebRect&) const; virtual bool executeCommand(const WebString&); virtual bool executeCommand(const WebString&, const WebString& value); virtual bool isCommandEnabled(const WebString&) const; @@ -142,10 +150,18 @@ public: virtual WebString selectionAsText() const; virtual WebString selectionAsMarkup() const; virtual bool selectWordAroundCaret(); - virtual int printBegin(const WebSize& pageSize); + virtual int printBegin(const WebSize& pageSize, int printerDPI, + bool* useBrowserOverlays); virtual float printPage(int pageToPrint, WebCanvas*); virtual float getPrintPageShrink(int page); virtual void printEnd(); + virtual bool isPageBoxVisible(int pageIndex); + virtual void pageSizeAndMarginsInPixels(int pageIndex, + WebSize& pageSize, + int& marginTop, + int& marginRight, + int& marginBottom, + int& marginLeft); virtual bool find( int identifier, const WebString& searchText, const WebFindOptions&, bool wrapWithinFrame, WebRect* selectionRect); @@ -156,17 +172,26 @@ public: virtual void cancelPendingScopingEffort(); virtual void increaseMatchCount(int count, int identifier); virtual void resetMatchCount(); - virtual void registerPasswordListener( + virtual bool registerPasswordListener( WebInputElement, WebPasswordAutocompleteListener*); + virtual void notifiyPasswordListenerOfAutocomplete( + const WebInputElement&); - virtual WebURL completeURL(const WebString& url) const; virtual WebString contentAsText(size_t maxChars) const; virtual WebString contentAsMarkup() const; virtual WebString renderTreeAsText() const; virtual WebString counterValueForElementById(const WebString& id) const; + virtual WebString markerTextForListItem(const WebElement&) const; virtual int pageNumberForElementById(const WebString& id, float pageWidthInPixels, float pageHeightInPixels) const; + virtual WebRect selectionBoundsRect() const; + + virtual bool selectionStartHasSpellingMarkerFor(int from, int length) const; + virtual bool pauseSVGAnimation(const WebString& animationId, + double time, + const WebString& elementId); + virtual WebString layerTreeAsText() const; static PassRefPtr<WebFrameImpl> create(WebFrameClient* client); ~WebFrameImpl(); @@ -179,11 +204,16 @@ public: void layout(); void paint(WebCanvas*, const WebRect&); + void paintWithContext(WebCore::GraphicsContext&, const WebRect&); void createFrameView(); static WebFrameImpl* fromFrame(WebCore::Frame* frame); static WebFrameImpl* fromFrameOwnerElement(WebCore::Element* element); + // If the frame hosts a PluginDocument, this method returns the WebPluginContainerImpl + // that hosts the plugin. + static WebPluginContainerImpl* pluginContainerFromFrame(WebCore::Frame*); + WebViewImpl* viewImpl() const; WebCore::Frame* frame() const { return m_frame; } @@ -212,16 +242,16 @@ public: // Sets whether the WebFrameImpl allows its document to be scrolled. // If the parameter is true, allow the document to be scrolled. // Otherwise, disallow scrolling. - void setAllowsScrolling(bool); + void setCanHaveScrollbars(bool); // Returns the password autocomplete listener associated with the passed // user name input element, or 0 if none available. // Note that the returned listener is owner by the WebFrameImpl and should not // be kept around as it is deleted when the page goes away. - WebPasswordAutocompleteListener* getPasswordListener(WebCore::HTMLInputElement*); + WebPasswordAutocompleteListener* getPasswordListener(const WebCore::HTMLInputElement*); WebFrameClient* client() const { return m_client; } - void dropClient() { m_client = 0; } + void setClient(WebFrameClient* client) { m_client = client; } static void selectWordAroundPosition(WebCore::Frame*, WebCore::VisiblePosition); @@ -267,7 +297,7 @@ private: // It is not necessary if the frame is invisible, for example, or if this // is a repeat search that already returned nothing last time the same prefix // was searched. - bool shouldScopeMatches(const WebCore::String& searchText); + bool shouldScopeMatches(const WTF::String& searchText); // Queue up a deferred call to scopeStringMatches. void scopeStringMatchesSoon( @@ -318,7 +348,7 @@ private: // short-circuiting searches in the following scenarios: When a frame has // been searched and returned 0 results, we don't need to search that frame // again if the user is just adding to the search (making it more specific). - WebCore::String m_lastSearchString; + WTF::String m_lastSearchString; // Keeps track of how many matches this frame has found so far, so that we // don't loose count between scoping efforts, and is also used (in conjunction @@ -359,6 +389,9 @@ private: // Keeps a reference to the frame's WebAnimationController. WebAnimationControllerImpl m_animationController; + + // The identifier of this frame. + long long m_identifier; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebGeolocationError.cpp b/WebKit/chromium/src/WebGeolocationError.cpp new file mode 100644 index 0000000..9acb676 --- /dev/null +++ b/WebKit/chromium/src/WebGeolocationError.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebGeolocationError.h" + +#include "GeolocationError.h" +#include "WebString.h" + +using namespace WebCore; + +namespace WebKit { + +void WebGeolocationError::assign(Error code, const WebString& message) +{ + m_private = GeolocationError::create(static_cast<GeolocationError::ErrorCode>(code), message); +} + +void WebGeolocationError::assign(const WebGeolocationError& other) +{ + m_private = other.m_private; +} + +void WebGeolocationError::reset() +{ + m_private.reset(); +} + +WebGeolocationError::WebGeolocationError(PassRefPtr<GeolocationError> error) +{ + m_private = error; +} + +WebGeolocationError& WebGeolocationError::operator=(PassRefPtr<GeolocationError> error) +{ + m_private = error; + return *this; +} + +WebGeolocationError::operator PassRefPtr<GeolocationError>() const +{ + return m_private.get(); +} + +} diff --git a/WebKit/chromium/src/WebGeolocationPosition.cpp b/WebKit/chromium/src/WebGeolocationPosition.cpp new file mode 100644 index 0000000..75b3306 --- /dev/null +++ b/WebKit/chromium/src/WebGeolocationPosition.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebGeolocationPosition.h" + +#include "GeolocationPosition.h" + +using namespace WebCore; + +namespace WebKit { + +void WebGeolocationPosition::assign(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed) +{ + m_private = GeolocationPosition::create(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed); +} + +void WebGeolocationPosition::assign(const WebGeolocationPosition& other) +{ + m_private = other.m_private; +} + +void WebGeolocationPosition::reset() +{ + m_private.reset(); +} + +WebGeolocationPosition& WebGeolocationPosition::operator=(PassRefPtr<GeolocationPosition> position) +{ + m_private = position; + return *this; +} + +WebGeolocationPosition::operator PassRefPtr<GeolocationPosition>() const +{ + return m_private.get(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp b/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp new file mode 100644 index 0000000..bbc852f --- /dev/null +++ b/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebGeolocationServiceBridgeImpl.h" + +#include "Chrome.h" +#include "ChromeClientImpl.h" +#include "Frame.h" +#include "Geolocation.h" +#include "GeolocationServiceChromium.h" +#include "Geoposition.h" +#include "Page.h" +#include "PositionError.h" +#include "PositionOptions.h" +#include "WebFrame.h" +#include "WebFrameImpl.h" +#include "WebGeolocationService.h" +#include "WebGeolocationServiceBridge.h" +#include "WebViewClient.h" +#include "WebViewImpl.h" + +#if ENABLE(GEOLOCATION) + +using WebCore::Coordinates; +using WebCore::Frame; +using WebCore::Geolocation; +using WebCore::GeolocationServiceBridge; +using WebCore::GeolocationServiceChromium; +using WebCore::GeolocationServiceClient; +using WebCore::Geoposition; +using WebCore::PositionError; +using WebCore::PositionOptions; +using WTF::String; + +namespace WebKit { + +class WebGeolocationServiceBridgeImpl : public GeolocationServiceBridge, public WebGeolocationServiceBridge { +public: + explicit WebGeolocationServiceBridgeImpl(GeolocationServiceChromium*); + virtual ~WebGeolocationServiceBridgeImpl(); + + // GeolocationServiceBridge + virtual bool startUpdating(PositionOptions*); + virtual void stopUpdating(); + virtual void suspend(); + virtual void resume(); + virtual int getBridgeId() const; + virtual void attachBridgeIfNeeded(); + + // WebGeolocationServiceBridge + virtual void setIsAllowed(bool allowed); + virtual void setLastPosition(double latitude, double longitude, bool providesAltitude, double altitude, double accuracy, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed, long long timestamp); + virtual void setLastError(int errorCode, const WebString& message); + virtual void didDestroyGeolocationService(); + +private: + bool isAttached() const; + // Pointer back to the WebKit geolocation client. We obtain this via the frame's page, but need to cache it + // as it may still be alive after the page has detached from the frame. + WebGeolocationService* m_webGeolocationService; + // GeolocationServiceChromium owns us, we only have a pointer back to it. + GeolocationServiceChromium* m_geolocationServiceChromium; + int m_bridgeId; +}; + +GeolocationServiceBridge* createGeolocationServiceBridgeImpl(GeolocationServiceChromium* geolocationServiceChromium) +{ + return new WebGeolocationServiceBridgeImpl(geolocationServiceChromium); +} + +WebGeolocationServiceBridgeImpl::WebGeolocationServiceBridgeImpl(GeolocationServiceChromium* geolocationServiceChromium) + : m_webGeolocationService(0) + , m_geolocationServiceChromium(geolocationServiceChromium) + , m_bridgeId(0) +{ +} + +WebGeolocationServiceBridgeImpl::~WebGeolocationServiceBridgeImpl() +{ + if (isAttached()) + m_webGeolocationService->detachBridge(m_bridgeId); +} + +bool WebGeolocationServiceBridgeImpl::startUpdating(PositionOptions* positionOptions) +{ + attachBridgeIfNeeded(); + if (!isAttached()) + return false; + m_webGeolocationService->startUpdating(m_bridgeId, m_geolocationServiceChromium->frame()->document()->url(), positionOptions->enableHighAccuracy()); + return true; +} + +void WebGeolocationServiceBridgeImpl::stopUpdating() +{ + if (isAttached()) { + m_webGeolocationService->stopUpdating(m_bridgeId); + m_webGeolocationService->detachBridge(m_bridgeId); + m_bridgeId = 0; + m_webGeolocationService = 0; + } +} + +void WebGeolocationServiceBridgeImpl::suspend() +{ + if (isAttached()) + m_webGeolocationService->suspend(m_bridgeId); +} + +void WebGeolocationServiceBridgeImpl::resume() +{ + if (isAttached()) + m_webGeolocationService->resume(m_bridgeId); +} + +int WebGeolocationServiceBridgeImpl::getBridgeId() const +{ + return m_bridgeId; +} + +void WebGeolocationServiceBridgeImpl::attachBridgeIfNeeded() +{ + if (isAttached()) + return; + // Lazy attach to the geolocation service of the associated page if there is one. + Frame* frame = m_geolocationServiceChromium->frame(); + if (!frame || !frame->page()) + return; + WebKit::ChromeClientImpl* chromeClientImpl = static_cast<WebKit::ChromeClientImpl*>(frame->page()->chrome()->client()); + WebKit::WebViewClient* webViewClient = chromeClientImpl->webView()->client(); + m_webGeolocationService = webViewClient->geolocationService(); + ASSERT(m_webGeolocationService); + m_bridgeId = m_webGeolocationService->attachBridge(this); + if (!m_bridgeId) { + // Attach failed. Release association with this service. + m_webGeolocationService = 0; + } +} + +void WebGeolocationServiceBridgeImpl::setIsAllowed(bool allowed) +{ + m_geolocationServiceChromium->setIsAllowed(allowed); +} + +void WebGeolocationServiceBridgeImpl::setLastPosition(double latitude, double longitude, bool providesAltitude, double altitude, double accuracy, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed, long long timestamp) +{ + RefPtr<Geoposition> geoposition = Geoposition::create(Coordinates::create(latitude, longitude, providesAltitude, altitude, accuracy, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed), timestamp); + m_geolocationServiceChromium->setLastPosition(geoposition); +} + +void WebGeolocationServiceBridgeImpl::setLastError(int errorCode, const WebString& message) +{ + m_geolocationServiceChromium->setLastError(errorCode, message); +} + +void WebGeolocationServiceBridgeImpl::didDestroyGeolocationService() +{ + m_bridgeId = 0; + m_webGeolocationService = 0; +} + +bool WebGeolocationServiceBridgeImpl::isAttached() const +{ + // Test the class invariant. + if (m_webGeolocationService) + ASSERT(m_bridgeId); + else + ASSERT(!m_bridgeId); + + return m_webGeolocationService; +} + +} // namespace WebKit + +#endif // ENABLE(GEOLOCATION) diff --git a/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.h b/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.h new file mode 100644 index 0000000..2c37bcb --- /dev/null +++ b/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2010, Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WebGeolocationServiceBridgeImpl_h +#define WebGeolocationServiceBridgeImpl_h + +namespace WebCore { +class GeolocationServiceBridge; +class GeolocationServiceChromium; +} + +namespace WebKit { +WebCore::GeolocationServiceBridge* createGeolocationServiceBridgeImpl(WebCore::GeolocationServiceChromium*); +} // namespace WebKit + +#endif // WebGeolocationServiceBridgeImpl_h diff --git a/WebKit/chromium/src/WebGeolocationServiceMock.cpp b/WebKit/chromium/src/WebGeolocationServiceMock.cpp new file mode 100644 index 0000000..07d3f44 --- /dev/null +++ b/WebKit/chromium/src/WebGeolocationServiceMock.cpp @@ -0,0 +1,277 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebGeolocationServiceMock.h" + +#include "GeolocationService.h" +#include "GeolocationServiceChromium.h" +#include "GeolocationServiceMock.h" +#include "WebGeolocationServiceBridge.h" +#include "WebString.h" +#include <wtf/CurrentTime.h> +#include <wtf/HashMap.h> +#include <wtf/Vector.h> + +#if ENABLE(GEOLOCATION) + +#if ENABLE(CLIENT_BASED_GEOLOCATION) +// FIXME: Implement mock bindings for client-based geolocation. Ultimately +// move to another class and remove WebGeolocationService*. + +namespace WebKit { + +class WebGeolocationServiceMockClientBasedImpl : public WebGeolocationServiceMock { +}; + +WebGeolocationServiceMock* WebGeolocationServiceMock::createWebGeolocationServiceMock() +{ + return new WebGeolocationServiceMockClientBasedImpl; +} + +void WebGeolocationServiceMock::setMockGeolocationPermission(bool allowed) +{ + // FIXME: Implement mock binding +} + +void WebGeolocationServiceMock::setMockGeolocationPosition(double latitude, double longitude, double accuracy) +{ + // FIXME: Implement mock binding +} + +void WebGeolocationServiceMock::setMockGeolocationError(int errorCode, const WebString& message) +{ + // FIXME: Implement mock binding +} + +} // namespace WebKit + +#else +using WebCore::Coordinates; +using WebCore::Frame; +using WebCore::Geolocation; +using WebCore::GeolocationServiceBridge; +using WebCore::GeolocationServiceChromium; +using WebCore::GeolocationServiceClient; +using WebCore::GeolocationServiceMock; +using WebCore::Geoposition; +using WebCore::PositionError; +using WebCore::PositionOptions; +using WTF::String; +using WTF::Vector; + +namespace WebCore { +class GeolocationServiceChromiumMock : public GeolocationServiceChromium, public GeolocationServiceClient { +public: + static GeolocationService* create(GeolocationServiceClient*); + virtual bool startUpdating(PositionOptions*); + virtual void stopUpdating(); + virtual Geoposition* lastPosition() const; + virtual PositionError* lastError() const; + + virtual void geolocationServicePositionChanged(GeolocationService*); + virtual void geolocationServiceErrorOccurred(GeolocationService*); + +private: + explicit GeolocationServiceChromiumMock(GeolocationServiceClient*); + + GeolocationServiceClient* m_geolocationServiceClient; + OwnPtr<GeolocationService> m_geolocationServiceMock; +}; + +GeolocationService* GeolocationServiceChromiumMock::create(GeolocationServiceClient* geolocationServiceClient) +{ + return new GeolocationServiceChromiumMock(geolocationServiceClient); +} + +GeolocationServiceChromiumMock::GeolocationServiceChromiumMock(GeolocationServiceClient* geolocationServiceClient) + : GeolocationServiceChromium(geolocationServiceClient), + m_geolocationServiceClient(geolocationServiceClient) +{ + m_geolocationServiceMock.set(GeolocationServiceMock::create(this)); +} + +bool GeolocationServiceChromiumMock::startUpdating(PositionOptions* positionOptions) +{ + GeolocationServiceChromium::startUpdating(positionOptions); + return m_geolocationServiceMock->startUpdating(positionOptions); +} + +void GeolocationServiceChromiumMock::stopUpdating() +{ + GeolocationServiceChromium::stopUpdating(); + m_geolocationServiceMock->stopUpdating(); +} + +Geoposition* GeolocationServiceChromiumMock::lastPosition() const +{ + return m_geolocationServiceMock->lastPosition(); +} + +PositionError* GeolocationServiceChromiumMock::lastError() const +{ + return m_geolocationServiceMock->lastError(); +} + +void GeolocationServiceChromiumMock::geolocationServicePositionChanged(GeolocationService* geolocationService) +{ + ASSERT_UNUSED(geolocationService, geolocationService == m_geolocationServiceMock); + m_geolocationServiceClient->geolocationServicePositionChanged(this); + +} + +void GeolocationServiceChromiumMock::geolocationServiceErrorOccurred(GeolocationService* geolocationService) +{ + ASSERT_UNUSED(geolocationService, geolocationService == m_geolocationServiceMock); + m_geolocationServiceClient->geolocationServiceErrorOccurred(this); +} + +} // namespace WebCore + +namespace WebKit { + +class WebGeolocationServiceMockImpl : public WebGeolocationServiceMock { +public: + WebGeolocationServiceMockImpl(); + virtual ~WebGeolocationServiceMockImpl(); + static void setMockGeolocationPermission(bool allowed); + + // WebGeolocationService + virtual void requestPermissionForFrame(int bridgeId, const WebURL& url); + virtual int attachBridge(WebGeolocationServiceBridge*); + virtual void detachBridge(int bridgeId); + +private: + void notifyPendingPermissions(); + + typedef HashMap<int, WebGeolocationServiceBridge*> IdToBridgeMap; + IdToBridgeMap m_idToBridgeMap; + Vector<int> m_pendingPermissionRequests; + + // In addition to the singleton instance pointer, we need to keep the setMockGeolocationPermission() state + // as a static (not object members) as this call may come in before the service has been created. + static enum PermissionState { + PermissionStateUnset, + PermissionStateAllowed, + PermissionStateDenied, + } s_permissionState; + static WebGeolocationServiceMockImpl* s_instance; +}; + +WebGeolocationServiceMockImpl::PermissionState WebGeolocationServiceMockImpl::s_permissionState = WebGeolocationServiceMockImpl::PermissionStateUnset; +WebGeolocationServiceMockImpl* WebGeolocationServiceMockImpl::s_instance = 0; + +WebGeolocationServiceMock* WebGeolocationServiceMock::createWebGeolocationServiceMock() +{ + return new WebGeolocationServiceMockImpl; +} + +void WebGeolocationServiceMock::setMockGeolocationPermission(bool allowed) +{ + WebGeolocationServiceMockImpl::setMockGeolocationPermission(allowed); +} + +void WebGeolocationServiceMock::setMockGeolocationPosition(double latitude, double longitude, double accuracy) +{ + WebCore::GeolocationService::setCustomMockFactory(&WebCore::GeolocationServiceChromiumMock::create); + RefPtr<Geoposition> geoposition = Geoposition::create(Coordinates::create(latitude, longitude, false, 0, accuracy, true, 0, false, 0, false, 0), currentTime() * 1000.0); + GeolocationServiceMock::setPosition(geoposition); +} + +void WebGeolocationServiceMock::setMockGeolocationError(int errorCode, const WebString& message) +{ + WebCore::GeolocationService::setCustomMockFactory(&WebCore::GeolocationServiceChromiumMock::create); + RefPtr<PositionError> positionError = PositionError::create(static_cast<PositionError::ErrorCode>(errorCode), message); + GeolocationServiceMock::setError(positionError); +} + +WebGeolocationServiceMockImpl::WebGeolocationServiceMockImpl() +{ + ASSERT(!s_instance); + s_instance = this; +} + +WebGeolocationServiceMockImpl::~WebGeolocationServiceMockImpl() +{ + ASSERT(this == s_instance); + s_instance = 0; + // Reset the permission state, so any future service instance (e.g. running + // multiple tests in a single DRT run) will see a clean call sequence. + s_permissionState = PermissionStateUnset; + for (IdToBridgeMap::iterator it = m_idToBridgeMap.begin(); it != m_idToBridgeMap.end(); ++it) + it->second->didDestroyGeolocationService(); +} + +void WebGeolocationServiceMockImpl::setMockGeolocationPermission(bool allowed) +{ + s_permissionState = allowed ? PermissionStateAllowed : PermissionStateDenied; + if (s_instance) + s_instance->notifyPendingPermissions(); +} + +void WebGeolocationServiceMockImpl::requestPermissionForFrame(int bridgeId, const WebURL& url) +{ + m_pendingPermissionRequests.append(bridgeId); + if (s_permissionState != PermissionStateUnset) + notifyPendingPermissions(); +} + +int WebGeolocationServiceMockImpl::attachBridge(WebGeolocationServiceBridge* bridge) +{ + static int nextAvailableWatchId = 1; + // In case of overflow, make sure the ID remains positive, but reuse the ID values. + if (nextAvailableWatchId < 1) + nextAvailableWatchId = 1; + m_idToBridgeMap.set(nextAvailableWatchId, bridge); + return nextAvailableWatchId++; +} + +void WebGeolocationServiceMockImpl::detachBridge(int bridgeId) +{ + m_idToBridgeMap.remove(bridgeId); +} + +void WebGeolocationServiceMockImpl::notifyPendingPermissions() +{ + ASSERT(s_permissionState == PermissionStateAllowed || s_permissionState == PermissionStateDenied); + Vector<int> pendingPermissionRequests; + pendingPermissionRequests.swap(m_pendingPermissionRequests); + for (Vector<int>::const_iterator it = pendingPermissionRequests.begin(); it != pendingPermissionRequests.end(); ++it) { + ASSERT(*it > 0); + IdToBridgeMap::iterator iter = m_idToBridgeMap.find(*it); + if (iter != m_idToBridgeMap.end()) + iter->second->setIsAllowed(s_permissionState == PermissionStateAllowed); + } +} + +} // namespace WebKit + +#endif // ENABLE(CLIENT_BASED_GEOLOCATION) +#endif // ENABLE(GEOLOCATION) diff --git a/WebKit/chromium/src/APUAgentDelegate.h b/WebKit/chromium/src/WebGraphicsContext3D.cpp index 70be702..ce6f55d 100644 --- a/WebKit/chromium/src/APUAgentDelegate.h +++ b/WebKit/chromium/src/WebGraphicsContext3D.cpp @@ -28,19 +28,20 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef APUAgentDelegate_h -#define APUAgentDelegate_h +#include "config.h" +#include "WebGraphicsContext3D.h" -#include "DevToolsRPC.h" +#include "WebGraphicsContext3DDefaultImpl.h" namespace WebKit { -#define APU_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, MEHTOD4, METHOD5) \ - /* Sends a json object to apu. */ \ - METHOD1(dispatchToApu, String /* data */) - -DEFINE_RPC_CLASS(ApuAgentDelegate, APU_AGENT_DELEGATE_STRUCT) +WebGraphicsContext3D* WebGraphicsContext3D::createDefault() +{ +#if ENABLE(3D_CANVAS) + return new WebGraphicsContext3DDefaultImpl(); +#else + return 0; +#endif +} } // namespace WebKit - -#endif diff --git a/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp b/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp new file mode 100644 index 0000000..9a74601 --- /dev/null +++ b/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp @@ -0,0 +1,1634 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" + +#if ENABLE(3D_CANVAS) + +#include "WebGraphicsContext3DDefaultImpl.h" + +#include "app/gfx/gl/gl_bindings.h" +#include "app/gfx/gl/gl_context.h" +#include "app/gfx/gl/gl_implementation.h" +#include "NotImplemented.h" +#include "WebView.h" +#include <wtf/OwnArrayPtr.h> +#include <wtf/PassOwnPtr.h> +#include <wtf/text/StringBuilder.h> +#include <wtf/text/WTFString.h> + +#include <stdio.h> +#include <string.h> + +namespace WebKit { + +enum { + MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + MAX_VARYING_VECTORS = 0x8DFC, + MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD +}; + +WebGraphicsContext3DDefaultImpl::VertexAttribPointerState::VertexAttribPointerState() + : enabled(false) + , buffer(0) + , indx(0) + , size(0) + , type(0) + , normalized(false) + , stride(0) + , offset(0) +{ +} + +WebGraphicsContext3DDefaultImpl::WebGraphicsContext3DDefaultImpl() + : m_initialized(false) + , m_renderDirectlyToWebView(false) + , m_isGLES2(false) + , m_haveEXTFramebufferObject(false) + , m_haveEXTFramebufferMultisample(false) + , m_haveANGLEFramebufferMultisample(false) + , m_texture(0) + , m_fbo(0) + , m_depthStencilBuffer(0) + , m_cachedWidth(0) + , m_cachedHeight(0) + , m_multisampleFBO(0) + , m_multisampleDepthStencilBuffer(0) + , m_multisampleColorBuffer(0) + , m_boundFBO(0) + , m_boundTexture(0) + , m_copyTextureToParentTextureFBO(0) +#ifdef FLIP_FRAMEBUFFER_VERTICALLY + , m_scanline(0) +#endif + , m_boundArrayBuffer(0) + , m_fragmentCompiler(0) + , m_vertexCompiler(0) +{ +} + +WebGraphicsContext3DDefaultImpl::~WebGraphicsContext3DDefaultImpl() +{ + if (m_initialized) { + makeContextCurrent(); + + if (m_attributes.antialias) { + glDeleteRenderbuffersEXT(1, &m_multisampleColorBuffer); + if (m_attributes.depth || m_attributes.stencil) + glDeleteRenderbuffersEXT(1, &m_multisampleDepthStencilBuffer); + glDeleteFramebuffersEXT(1, &m_multisampleFBO); + } else { + if (m_attributes.depth || m_attributes.stencil) + glDeleteRenderbuffersEXT(1, &m_depthStencilBuffer); + } + glDeleteTextures(1, &m_texture); + glDeleteFramebuffersEXT(1, &m_copyTextureToParentTextureFBO); +#ifdef FLIP_FRAMEBUFFER_VERTICALLY + if (m_scanline) + delete[] m_scanline; +#endif + glDeleteFramebuffersEXT(1, &m_fbo); + + m_glContext->Destroy(); + + for (ShaderSourceMap::iterator ii = m_shaderSourceMap.begin(); ii != m_shaderSourceMap.end(); ++ii) { + if (ii->second) + delete ii->second; + } + angleDestroyCompilers(); + } +} + +bool WebGraphicsContext3DDefaultImpl::initialize(WebGraphicsContext3D::Attributes attributes, WebView* webView, bool renderDirectlyToWebView) +{ + if (!gfx::GLContext::InitializeOneOff()) + return false; + + m_renderDirectlyToWebView = renderDirectlyToWebView; + gfx::GLContext* shareContext = 0; + + if (!renderDirectlyToWebView) { + // Pick up the compositor's context to share resources with. + WebGraphicsContext3D* viewContext = webView->graphicsContext3D(); + if (viewContext) { + WebGraphicsContext3DDefaultImpl* contextImpl = static_cast<WebGraphicsContext3DDefaultImpl*>(viewContext); + shareContext = contextImpl->m_glContext.get(); + } else { + // The compositor's context didn't get created + // successfully, so conceptually there is no way we can + // render successfully to the WebView. + m_renderDirectlyToWebView = false; + } + } + + // This implementation always renders offscreen regardless of + // whether renderDirectlyToWebView is true. Both DumpRenderTree + // and test_shell paint first to an intermediate offscreen buffer + // and from there to the window, and WebViewImpl::paint already + // correctly handles the case where the compositor is active but + // the output needs to go to a WebCanvas. + m_glContext = WTF::adoptPtr(gfx::GLContext::CreateOffscreenGLContext(shareContext)); + if (!m_glContext) + return false; + + m_attributes = attributes; + + // FIXME: for the moment we disable multisampling for the compositor. + // It actually works in this implementation, but there are a few + // considerations. First, we likely want to reduce the fuzziness in + // these tests as much as possible because we want to run pixel tests. + // Second, Mesa's multisampling doesn't seem to antialias straight + // edges in some CSS 3D samples. Third, we don't have multisampling + // support for the compositor in the normal case at the time of this + // writing. + if (renderDirectlyToWebView) + m_attributes.antialias = false; + + m_isGLES2 = gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2; + const char* extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); + m_haveEXTFramebufferObject = strstr(extensions, "GL_EXT_framebuffer_object"); + m_haveEXTFramebufferMultisample = strstr(extensions, "GL_EXT_framebuffer_multisample"); + m_haveANGLEFramebufferMultisample = strstr(extensions, "GL_ANGLE_framebuffer_multisample"); + + validateAttributes(); + + if (!m_isGLES2) { + glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); + glEnable(GL_POINT_SPRITE); + } + + if (!angleCreateCompilers()) { + angleDestroyCompilers(); + return false; + } + + glGenFramebuffersEXT(1, &m_copyTextureToParentTextureFBO); + + m_initialized = true; + return true; +} + +void WebGraphicsContext3DDefaultImpl::validateAttributes() +{ + const char* extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); + + if (m_attributes.stencil) { + if (strstr(extensions, "GL_OES_packed_depth_stencil") + || strstr(extensions, "GL_EXT_packed_depth_stencil")) { + if (!m_attributes.depth) + m_attributes.depth = true; + } else + m_attributes.stencil = false; + } + if (m_attributes.antialias) { + bool isValidVendor = true; +#if PLATFORM(CG) + // Currently in Mac we only turn on antialias if vendor is NVIDIA. + const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); + if (!strstr(vendor, "NVIDIA")) + isValidVendor = false; +#endif + if (!(isValidVendor + && (m_haveEXTFramebufferMultisample + || (m_haveANGLEFramebufferMultisample && strstr(extensions, "GL_OES_rgb8_rgba8"))))) + m_attributes.antialias = false; + + // Don't antialias when using Mesa to ensure more reliable testing and + // because it doesn't appear to multisample straight lines correctly. + const char* renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER)); + if (!strncmp(renderer, "Mesa", 4)) + m_attributes.antialias = false; + } + // FIXME: instead of enforcing premultipliedAlpha = true, implement the + // correct behavior when premultipliedAlpha = false is requested. + m_attributes.premultipliedAlpha = true; +} + +void WebGraphicsContext3DDefaultImpl::resolveMultisampledFramebuffer(unsigned x, unsigned y, unsigned width, unsigned height) +{ + if (m_attributes.antialias) { + glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO); + glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo); + if (m_haveEXTFramebufferMultisample) + glBlitFramebufferEXT(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + else { + ASSERT(m_haveANGLEFramebufferMultisample); + glBlitFramebufferANGLE(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + } + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); + } +} + +bool WebGraphicsContext3DDefaultImpl::makeContextCurrent() +{ + return m_glContext->MakeCurrent(); +} + +int WebGraphicsContext3DDefaultImpl::width() +{ + return m_cachedWidth; +} + +int WebGraphicsContext3DDefaultImpl::height() +{ + return m_cachedHeight; +} + +int WebGraphicsContext3DDefaultImpl::sizeInBytes(int type) +{ + switch (type) { + case GL_BYTE: + return sizeof(GLbyte); + case GL_UNSIGNED_BYTE: + return sizeof(GLubyte); + case GL_SHORT: + return sizeof(GLshort); + case GL_UNSIGNED_SHORT: + return sizeof(GLushort); + case GL_INT: + return sizeof(GLint); + case GL_UNSIGNED_INT: + return sizeof(GLuint); + case GL_FLOAT: + return sizeof(GLfloat); + } + return 0; +} + +bool WebGraphicsContext3DDefaultImpl::isGLES2Compliant() +{ + return m_isGLES2; +} + +unsigned int WebGraphicsContext3DDefaultImpl::getPlatformTextureId() +{ + return m_texture; +} + +void WebGraphicsContext3DDefaultImpl::prepareTexture() +{ + if (!m_renderDirectlyToWebView) { + // We need to prepare our rendering results for the compositor. + makeContextCurrent(); + resolveMultisampledFramebuffer(0, 0, m_cachedWidth, m_cachedHeight); + } +} + +static int createTextureObject(GLenum target) +{ + GLuint texture = 0; + glGenTextures(1, &texture); + glBindTexture(target, texture); + glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + return texture; +} + +void WebGraphicsContext3DDefaultImpl::reshape(int width, int height) +{ + m_cachedWidth = width; + m_cachedHeight = height; + makeContextCurrent(); + + GLenum target = GL_TEXTURE_2D; + + if (!m_texture) { + // Generate the texture object + m_texture = createTextureObject(target); + // Generate the framebuffer object + glGenFramebuffersEXT(1, &m_fbo); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); + m_boundFBO = m_fbo; + if (m_attributes.depth || m_attributes.stencil) + glGenRenderbuffersEXT(1, &m_depthStencilBuffer); + // Generate the multisample framebuffer object + if (m_attributes.antialias) { + glGenFramebuffersEXT(1, &m_multisampleFBO); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO); + m_boundFBO = m_multisampleFBO; + glGenRenderbuffersEXT(1, &m_multisampleColorBuffer); + if (m_attributes.depth || m_attributes.stencil) + glGenRenderbuffersEXT(1, &m_multisampleDepthStencilBuffer); + } + } + + GLint internalMultisampledColorFormat, internalColorFormat, colorFormat, internalDepthStencilFormat = 0; + if (m_attributes.alpha) { + // GL_RGBA8_OES == GL_RGBA8 + internalMultisampledColorFormat = GL_RGBA8; + internalColorFormat = m_isGLES2 ? GL_RGBA : GL_RGBA8; + colorFormat = GL_RGBA; + } else { + // GL_RGB8_OES == GL_RGB8 + internalMultisampledColorFormat = GL_RGB8; + internalColorFormat = m_isGLES2 ? GL_RGB : GL_RGB8; + colorFormat = GL_RGB; + } + if (m_attributes.stencil || m_attributes.depth) { + // We don't allow the logic where stencil is required and depth is not. + // See GraphicsContext3DInternal constructor. + if (m_attributes.stencil && m_attributes.depth) + internalDepthStencilFormat = GL_DEPTH24_STENCIL8_EXT; + else { + if (m_isGLES2) + internalDepthStencilFormat = GL_DEPTH_COMPONENT16; + else + internalDepthStencilFormat = GL_DEPTH_COMPONENT; + } + } + + bool mustRestoreFBO = false; + + // Resize multisampling FBO + if (m_attributes.antialias) { + GLint maxSampleCount; + glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSampleCount); + GLint sampleCount = std::min(8, maxSampleCount); + if (m_boundFBO != m_multisampleFBO) { + mustRestoreFBO = true; + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO); + } + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_multisampleColorBuffer); + if (m_haveEXTFramebufferMultisample) + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleCount, internalMultisampledColorFormat, width, height); + else { + ASSERT(m_haveANGLEFramebufferMultisample); + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER_EXT, sampleCount, internalMultisampledColorFormat, width, height); + } + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_multisampleColorBuffer); + if (m_attributes.stencil || m_attributes.depth) { + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer); + if (m_haveEXTFramebufferMultisample) + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleCount, internalDepthStencilFormat, width, height); + else { + ASSERT(m_haveANGLEFramebufferMultisample); + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER_EXT, sampleCount, internalDepthStencilFormat, width, height); + } + if (m_attributes.stencil) + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer); + if (m_attributes.depth) + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer); + } + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { + printf("GraphicsContext3D: multisampling framebuffer was incomplete\n"); + + // FIXME: cleanup. + notImplemented(); + } + } + + // Resize regular FBO + if (m_boundFBO != m_fbo) { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); + mustRestoreFBO = true; + } + glBindTexture(target, m_texture); + glTexImage2D(target, 0, internalColorFormat, width, height, 0, colorFormat, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target, m_texture, 0); + glBindTexture(target, 0); + if (!m_attributes.antialias && (m_attributes.stencil || m_attributes.depth)) { + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthStencilBuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, internalDepthStencilFormat, width, height); + if (m_attributes.stencil) + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthStencilBuffer); + if (m_attributes.depth) + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthStencilBuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + } + GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { + printf("WebGraphicsContext3DDefaultImpl: framebuffer was incomplete\n"); + + // FIXME: cleanup. + notImplemented(); + } + + if (m_attributes.antialias) { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO); + if (m_boundFBO == m_multisampleFBO) + mustRestoreFBO = false; + } + + // Initialize renderbuffers to 0. + GLfloat clearColor[] = {0, 0, 0, 0}, clearDepth = 0; + GLint clearStencil = 0; + GLboolean colorMask[] = {GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE}, depthMask = GL_TRUE; + GLuint stencilMask = 0xffffffff; + GLboolean isScissorEnabled = GL_FALSE; + GLboolean isDitherEnabled = GL_FALSE; + GLbitfield clearMask = GL_COLOR_BUFFER_BIT; + glGetFloatv(GL_COLOR_CLEAR_VALUE, clearColor); + glClearColor(0, 0, 0, 0); + glGetBooleanv(GL_COLOR_WRITEMASK, colorMask); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + if (m_attributes.depth) { + glGetFloatv(GL_DEPTH_CLEAR_VALUE, &clearDepth); + glClearDepth(1); + glGetBooleanv(GL_DEPTH_WRITEMASK, &depthMask); + glDepthMask(GL_TRUE); + clearMask |= GL_DEPTH_BUFFER_BIT; + } + if (m_attributes.stencil) { + glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &clearStencil); + glClearStencil(0); + glGetIntegerv(GL_STENCIL_WRITEMASK, reinterpret_cast<GLint*>(&stencilMask)); + glStencilMaskSeparate(GL_FRONT, 0xffffffff); + clearMask |= GL_STENCIL_BUFFER_BIT; + } + isScissorEnabled = glIsEnabled(GL_SCISSOR_TEST); + glDisable(GL_SCISSOR_TEST); + isDitherEnabled = glIsEnabled(GL_DITHER); + glDisable(GL_DITHER); + + glClear(clearMask); + + glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); + glColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]); + if (m_attributes.depth) { + glClearDepth(clearDepth); + glDepthMask(depthMask); + } + if (m_attributes.stencil) { + glClearStencil(clearStencil); + glStencilMaskSeparate(GL_FRONT, stencilMask); + } + if (isScissorEnabled) + glEnable(GL_SCISSOR_TEST); + else + glDisable(GL_SCISSOR_TEST); + if (isDitherEnabled) + glEnable(GL_DITHER); + else + glDisable(GL_DITHER); + + if (mustRestoreFBO) + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); + +#ifdef FLIP_FRAMEBUFFER_VERTICALLY + if (m_scanline) { + delete[] m_scanline; + m_scanline = 0; + } + m_scanline = new unsigned char[width * 4]; +#endif // FLIP_FRAMEBUFFER_VERTICALLY +} + +#ifdef FLIP_FRAMEBUFFER_VERTICALLY +void WebGraphicsContext3DDefaultImpl::flipVertically(unsigned char* framebuffer, + unsigned int width, + unsigned int height) +{ + unsigned char* scanline = m_scanline; + if (!scanline) + return; + unsigned int rowBytes = width * 4; + unsigned int count = height / 2; + for (unsigned int i = 0; i < count; i++) { + unsigned char* rowA = framebuffer + i * rowBytes; + unsigned char* rowB = framebuffer + (height - i - 1) * rowBytes; + // FIXME: this is where the multiplication of the alpha + // channel into the color buffer will need to occur if the + // user specifies the "premultiplyAlpha" flag in the context + // creation attributes. + memcpy(scanline, rowB, rowBytes); + memcpy(rowB, rowA, rowBytes); + memcpy(rowA, scanline, rowBytes); + } +} +#endif + +bool WebGraphicsContext3DDefaultImpl::readBackFramebuffer(unsigned char* pixels, size_t bufferSize) +{ + if (bufferSize != static_cast<size_t>(4 * width() * height())) + return false; + + makeContextCurrent(); + + // Earlier versions of this code used the GPU to flip the + // framebuffer vertically before reading it back for compositing + // via software. This code was quite complicated, used a lot of + // GPU memory, and didn't provide an obvious speedup. Since this + // vertical flip is only a temporary solution anyway until Chrome + // is fully GPU composited, it wasn't worth the complexity. + + resolveMultisampledFramebuffer(0, 0, m_cachedWidth, m_cachedHeight); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); + + GLint packAlignment = 4; + bool mustRestorePackAlignment = false; + glGetIntegerv(GL_PACK_ALIGNMENT, &packAlignment); + if (packAlignment > 4) { + glPixelStorei(GL_PACK_ALIGNMENT, 4); + mustRestorePackAlignment = true; + } + + if (m_isGLES2) { + // FIXME: consider testing for presence of GL_OES_read_format + // and GL_EXT_read_format_bgra, and using GL_BGRA_EXT here + // directly. + glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + for (size_t i = 0; i < bufferSize; i += 4) + std::swap(pixels[i], pixels[i + 2]); + } else + glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_BGRA, GL_UNSIGNED_BYTE, pixels); + + if (mustRestorePackAlignment) + glPixelStorei(GL_PACK_ALIGNMENT, packAlignment); + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); + +#ifdef FLIP_FRAMEBUFFER_VERTICALLY + if (pixels) + flipVertically(pixels, m_cachedWidth, m_cachedHeight); +#endif + + return true; +} + +void WebGraphicsContext3DDefaultImpl::synthesizeGLError(unsigned long error) +{ + m_syntheticErrors.add(error); +} + +void* WebGraphicsContext3DDefaultImpl::mapBufferSubDataCHROMIUM(unsigned target, int offset, int size, unsigned access) +{ + return 0; +} + +void WebGraphicsContext3DDefaultImpl::unmapBufferSubDataCHROMIUM(const void* mem) +{ +} + +void* WebGraphicsContext3DDefaultImpl::mapTexSubImage2DCHROMIUM(unsigned target, int level, int xoffset, int yoffset, int width, int height, unsigned format, unsigned type, unsigned access) +{ + return 0; +} + +void WebGraphicsContext3DDefaultImpl::unmapTexSubImage2DCHROMIUM(const void* mem) +{ +} + +void WebGraphicsContext3DDefaultImpl::copyTextureToParentTextureCHROMIUM(unsigned id, unsigned id2) +{ + if (!glGetTexLevelParameteriv) + return; + + makeContextCurrent(); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_copyTextureToParentTextureFBO); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + id, + 0); // level + glBindTexture(GL_TEXTURE_2D, id2); + GLsizei width, height; + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height); + glCopyTexImage2D(GL_TEXTURE_2D, + 0, // level + GL_RGBA, + 0, 0, // x, y + width, + height, + 0); // border + glBindTexture(GL_TEXTURE_2D, m_boundTexture); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); +} + +// Helper macros to reduce the amount of code. + +#define DELEGATE_TO_GL(name, glname) \ +void WebGraphicsContext3DDefaultImpl::name() \ +{ \ + makeContextCurrent(); \ + gl##glname(); \ +} + +#define DELEGATE_TO_GL_1(name, glname, t1) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1); \ +} + +#define DELEGATE_TO_GL_1R(name, glname, t1, rt) \ +rt WebGraphicsContext3DDefaultImpl::name(t1 a1) \ +{ \ + makeContextCurrent(); \ + return gl##glname(a1); \ +} + +#define DELEGATE_TO_GL_2(name, glname, t1, t2) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1, a2); \ +} + +#define DELEGATE_TO_GL_2R(name, glname, t1, t2, rt) \ +rt WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2) \ +{ \ + makeContextCurrent(); \ + return gl##glname(a1, a2); \ +} + +#define DELEGATE_TO_GL_3(name, glname, t1, t2, t3) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1, a2, a3); \ +} + +#define DELEGATE_TO_GL_4(name, glname, t1, t2, t3, t4) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1, a2, a3, a4); \ +} + +#define DELEGATE_TO_GL_5(name, glname, t1, t2, t3, t4, t5) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1, a2, a3, a4, a5); \ +} + +#define DELEGATE_TO_GL_6(name, glname, t1, t2, t3, t4, t5, t6) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1, a2, a3, a4, a5, a6); \ +} + +#define DELEGATE_TO_GL_7(name, glname, t1, t2, t3, t4, t5, t6, t7) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1, a2, a3, a4, a5, a6, a7); \ +} + +#define DELEGATE_TO_GL_8(name, glname, t1, t2, t3, t4, t5, t6, t7, t8) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1, a2, a3, a4, a5, a6, a7, a8); \ +} + +#define DELEGATE_TO_GL_9(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ +void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8, t9 a9) \ +{ \ + makeContextCurrent(); \ + gl##glname(a1, a2, a3, a4, a5, a6, a7, a8, a9); \ +} + +void WebGraphicsContext3DDefaultImpl::activeTexture(unsigned long texture) +{ + // FIXME: query number of textures available. + if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0+32) + // FIXME: raise exception. + return; + + makeContextCurrent(); + glActiveTexture(texture); +} + +DELEGATE_TO_GL_2(attachShader, AttachShader, WebGLId, WebGLId) + +DELEGATE_TO_GL_3(bindAttribLocation, BindAttribLocation, WebGLId, unsigned long, const char*) + +void WebGraphicsContext3DDefaultImpl::bindBuffer(unsigned long target, WebGLId buffer) +{ + makeContextCurrent(); + if (target == GL_ARRAY_BUFFER) + m_boundArrayBuffer = buffer; + glBindBuffer(target, buffer); +} + +void WebGraphicsContext3DDefaultImpl::bindFramebuffer(unsigned long target, WebGLId framebuffer) +{ + makeContextCurrent(); + if (!framebuffer) + framebuffer = (m_attributes.antialias ? m_multisampleFBO : m_fbo); + if (framebuffer != m_boundFBO) { + glBindFramebufferEXT(target, framebuffer); + m_boundFBO = framebuffer; + } +} + +DELEGATE_TO_GL_2(bindRenderbuffer, BindRenderbufferEXT, unsigned long, WebGLId) + +void WebGraphicsContext3DDefaultImpl::bindTexture(unsigned long target, WebGLId texture) +{ + makeContextCurrent(); + glBindTexture(target, texture); + m_boundTexture = texture; +} + +DELEGATE_TO_GL_4(blendColor, BlendColor, double, double, double, double) + +DELEGATE_TO_GL_1(blendEquation, BlendEquation, unsigned long) + +DELEGATE_TO_GL_2(blendEquationSeparate, BlendEquationSeparate, unsigned long, unsigned long) + +DELEGATE_TO_GL_2(blendFunc, BlendFunc, unsigned long, unsigned long) + +DELEGATE_TO_GL_4(blendFuncSeparate, BlendFuncSeparate, unsigned long, unsigned long, unsigned long, unsigned long) + +DELEGATE_TO_GL_4(bufferData, BufferData, unsigned long, int, const void*, unsigned long) + +DELEGATE_TO_GL_4(bufferSubData, BufferSubData, unsigned long, long, int, const void*) + +DELEGATE_TO_GL_1R(checkFramebufferStatus, CheckFramebufferStatusEXT, unsigned long, unsigned long) + +DELEGATE_TO_GL_1(clear, Clear, unsigned long) + +DELEGATE_TO_GL_4(clearColor, ClearColor, double, double, double, double) + +DELEGATE_TO_GL_1(clearDepth, ClearDepth, double) + +DELEGATE_TO_GL_1(clearStencil, ClearStencil, long) + +DELEGATE_TO_GL_4(colorMask, ColorMask, bool, bool, bool, bool) + +void WebGraphicsContext3DDefaultImpl::compileShader(WebGLId shader) +{ + makeContextCurrent(); + + ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader); + if (result == m_shaderSourceMap.end()) { + // Passing down to gl driver to generate the correct error; or the case + // where the shader deletion is delayed when it's attached to a program. + glCompileShader(shader); + return; + } + ShaderSourceEntry* entry = result->second; + ASSERT(entry); + + if (!angleValidateShaderSource(*entry)) + return; // Shader didn't validate, don't move forward with compiling translated source + + int shaderLength = entry->translatedSource ? strlen(entry->translatedSource) : 0; + glShaderSource(shader, 1, const_cast<const char**>(&entry->translatedSource), &shaderLength); + glCompileShader(shader); + +#ifndef NDEBUG + int compileStatus; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus); + // ASSERT that ANGLE generated GLSL will be accepted by OpenGL + ASSERT(compileStatus == GL_TRUE); +#endif +} + +void WebGraphicsContext3DDefaultImpl::copyTexImage2D(unsigned long target, long level, unsigned long internalformat, + long x, long y, unsigned long width, unsigned long height, long border) +{ + makeContextCurrent(); + + bool needsResolve = (m_attributes.antialias && m_boundFBO == m_multisampleFBO); + if (needsResolve) { + resolveMultisampledFramebuffer(x, y, width, height); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); + } + + glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); + + if (needsResolve) + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); +} + +void WebGraphicsContext3DDefaultImpl::copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, + long x, long y, unsigned long width, unsigned long height) +{ + makeContextCurrent(); + + bool needsResolve = (m_attributes.antialias && m_boundFBO == m_multisampleFBO); + if (needsResolve) { + resolveMultisampledFramebuffer(x, y, width, height); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); + } + + glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); + + if (needsResolve) + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); +} + +DELEGATE_TO_GL_1(cullFace, CullFace, unsigned long) + +DELEGATE_TO_GL_1(depthFunc, DepthFunc, unsigned long) + +DELEGATE_TO_GL_1(depthMask, DepthMask, bool) + +DELEGATE_TO_GL_2(depthRange, DepthRange, double, double) + +DELEGATE_TO_GL_2(detachShader, DetachShader, WebGLId, WebGLId) + +DELEGATE_TO_GL_1(disable, Disable, unsigned long) + +void WebGraphicsContext3DDefaultImpl::disableVertexAttribArray(unsigned long index) +{ + makeContextCurrent(); + if (index < NumTrackedPointerStates) + m_vertexAttribPointerState[index].enabled = false; + glDisableVertexAttribArray(index); +} + +DELEGATE_TO_GL_3(drawArrays, DrawArrays, unsigned long, long, long) + +void WebGraphicsContext3DDefaultImpl::drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset) +{ + makeContextCurrent(); + glDrawElements(mode, count, type, + reinterpret_cast<void*>(static_cast<intptr_t>(offset))); +} + +DELEGATE_TO_GL_1(enable, Enable, unsigned long) + +void WebGraphicsContext3DDefaultImpl::enableVertexAttribArray(unsigned long index) +{ + makeContextCurrent(); + if (index < NumTrackedPointerStates) + m_vertexAttribPointerState[index].enabled = true; + glEnableVertexAttribArray(index); +} + +DELEGATE_TO_GL(finish, Finish) + +DELEGATE_TO_GL(flush, Flush) + +DELEGATE_TO_GL_4(framebufferRenderbuffer, FramebufferRenderbufferEXT, unsigned long, unsigned long, unsigned long, WebGLId) + +DELEGATE_TO_GL_5(framebufferTexture2D, FramebufferTexture2DEXT, unsigned long, unsigned long, unsigned long, WebGLId, long) + +DELEGATE_TO_GL_1(frontFace, FrontFace, unsigned long) + +void WebGraphicsContext3DDefaultImpl::generateMipmap(unsigned long target) +{ + makeContextCurrent(); + if (m_isGLES2 || m_haveEXTFramebufferObject) + glGenerateMipmapEXT(target); + // FIXME: provide alternative code path? This will be unpleasant + // to implement if glGenerateMipmapEXT is not available -- it will + // require a texture readback and re-upload. +} + +bool WebGraphicsContext3DDefaultImpl::getActiveAttrib(WebGLId program, unsigned long index, ActiveInfo& info) +{ + makeContextCurrent(); + if (!program) { + synthesizeGLError(GL_INVALID_VALUE); + return false; + } + GLint maxNameLength = -1; + glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxNameLength); + if (maxNameLength < 0) + return false; + GLchar* name = 0; + if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) { + synthesizeGLError(GL_OUT_OF_MEMORY); + return false; + } + GLsizei length = 0; + GLint size = -1; + GLenum type = 0; + glGetActiveAttrib(program, index, maxNameLength, + &length, &size, &type, name); + if (size < 0) { + fastFree(name); + return false; + } + info.name = WebString::fromUTF8(name, length); + info.type = type; + info.size = size; + fastFree(name); + return true; +} + +bool WebGraphicsContext3DDefaultImpl::getActiveUniform(WebGLId program, unsigned long index, ActiveInfo& info) +{ + makeContextCurrent(); + GLint maxNameLength = -1; + glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength); + if (maxNameLength < 0) + return false; + GLchar* name = 0; + if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) { + synthesizeGLError(GL_OUT_OF_MEMORY); + return false; + } + GLsizei length = 0; + GLint size = -1; + GLenum type = 0; + glGetActiveUniform(program, index, maxNameLength, + &length, &size, &type, name); + if (size < 0) { + fastFree(name); + return false; + } + info.name = WebString::fromUTF8(name, length); + info.type = type; + info.size = size; + fastFree(name); + return true; +} + +DELEGATE_TO_GL_4(getAttachedShaders, GetAttachedShaders, WebGLId, int, int*, unsigned int*) + +DELEGATE_TO_GL_2R(getAttribLocation, GetAttribLocation, WebGLId, const char*, int) + +DELEGATE_TO_GL_2(getBooleanv, GetBooleanv, unsigned long, unsigned char*) + +DELEGATE_TO_GL_3(getBufferParameteriv, GetBufferParameteriv, unsigned long, unsigned long, int*) + +WebGraphicsContext3D::Attributes WebGraphicsContext3DDefaultImpl::getContextAttributes() +{ + return m_attributes; +} + +unsigned long WebGraphicsContext3DDefaultImpl::getError() +{ + if (m_syntheticErrors.size() > 0) { + ListHashSet<unsigned long>::iterator iter = m_syntheticErrors.begin(); + unsigned long err = *iter; + m_syntheticErrors.remove(iter); + return err; + } + + makeContextCurrent(); + return glGetError(); +} + +bool WebGraphicsContext3DDefaultImpl::isContextLost() +{ + return false; +} + +DELEGATE_TO_GL_2(getFloatv, GetFloatv, unsigned long, float*) + +void WebGraphicsContext3DDefaultImpl::getFramebufferAttachmentParameteriv(unsigned long target, unsigned long attachment, + unsigned long pname, int* value) +{ + makeContextCurrent(); + if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) + attachment = GL_DEPTH_ATTACHMENT; // Or GL_STENCIL_ATTACHMENT, either works. + glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, value); +} + +void WebGraphicsContext3DDefaultImpl::getIntegerv(unsigned long pname, int* value) +{ + makeContextCurrent(); + if (m_isGLES2) { + glGetIntegerv(pname, value); + return; + } + // Need to emulate MAX_FRAGMENT/VERTEX_UNIFORM_VECTORS and MAX_VARYING_VECTORS + // because desktop GL's corresponding queries return the number of components + // whereas GLES2 return the number of vectors (each vector has 4 components). + // Therefore, the value returned by desktop GL needs to be divided by 4. + switch (pname) { + case MAX_FRAGMENT_UNIFORM_VECTORS: + glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, value); + *value /= 4; + break; + case MAX_VERTEX_UNIFORM_VECTORS: + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, value); + *value /= 4; + break; + case MAX_VARYING_VECTORS: + glGetIntegerv(GL_MAX_VARYING_FLOATS, value); + *value /= 4; + break; + default: + glGetIntegerv(pname, value); + } +} + +DELEGATE_TO_GL_3(getProgramiv, GetProgramiv, WebGLId, unsigned long, int*) + +WebString WebGraphicsContext3DDefaultImpl::getProgramInfoLog(WebGLId program) +{ + makeContextCurrent(); + GLint logLength; + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); + if (!logLength) + return WebString(); + GLchar* log = 0; + if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log)) + return WebString(); + GLsizei returnedLogLength; + glGetProgramInfoLog(program, logLength, &returnedLogLength, log); + ASSERT(logLength == returnedLogLength + 1); + WebString res = WebString::fromUTF8(log, returnedLogLength); + fastFree(log); + return res; +} + +DELEGATE_TO_GL_3(getRenderbufferParameteriv, GetRenderbufferParameterivEXT, unsigned long, unsigned long, int*) + +void WebGraphicsContext3DDefaultImpl::getShaderiv(WebGLId shader, unsigned long pname, int* value) +{ + makeContextCurrent(); + + ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader); + if (result != m_shaderSourceMap.end()) { + ShaderSourceEntry* entry = result->second; + ASSERT(entry); + switch (pname) { + case GL_COMPILE_STATUS: + if (!entry->isValid) { + *value = 0; + return; + } + break; + case GL_INFO_LOG_LENGTH: + if (!entry->isValid) { + *value = entry->log ? strlen(entry->log) : 0; + if (*value) + (*value)++; + return; + } + break; + case GL_SHADER_SOURCE_LENGTH: + *value = entry->source ? strlen(entry->source) : 0; + if (*value) + (*value)++; + return; + } + } + + glGetShaderiv(shader, pname, value); +} + +WebString WebGraphicsContext3DDefaultImpl::getShaderInfoLog(WebGLId shader) +{ + makeContextCurrent(); + + ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader); + if (result != m_shaderSourceMap.end()) { + ShaderSourceEntry* entry = result->second; + ASSERT(entry); + if (!entry->isValid) { + if (!entry->log) + return WebString(); + WebString res = WebString::fromUTF8(entry->log, strlen(entry->log)); + return res; + } + } + + GLint logLength = 0; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength); + if (logLength <= 1) + return WebString(); + GLchar* log = 0; + if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log)) + return WebString(); + GLsizei returnedLogLength; + glGetShaderInfoLog(shader, logLength, &returnedLogLength, log); + ASSERT(logLength == returnedLogLength + 1); + WebString res = WebString::fromUTF8(log, returnedLogLength); + fastFree(log); + return res; +} + +WebString WebGraphicsContext3DDefaultImpl::getShaderSource(WebGLId shader) +{ + makeContextCurrent(); + + ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader); + if (result != m_shaderSourceMap.end()) { + ShaderSourceEntry* entry = result->second; + ASSERT(entry); + if (!entry->source) + return WebString(); + WebString res = WebString::fromUTF8(entry->source, strlen(entry->source)); + return res; + } + + GLint logLength = 0; + glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &logLength); + if (logLength <= 1) + return WebString(); + GLchar* log = 0; + if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log)) + return WebString(); + GLsizei returnedLogLength; + glGetShaderSource(shader, logLength, &returnedLogLength, log); + ASSERT(logLength == returnedLogLength + 1); + WebString res = WebString::fromUTF8(log, returnedLogLength); + fastFree(log); + return res; +} + +WebString WebGraphicsContext3DDefaultImpl::getString(unsigned long name) +{ + makeContextCurrent(); + StringBuilder result; + result.append(reinterpret_cast<const char*>(glGetString(name))); + if (name == GL_EXTENSIONS) { + // GL_CHROMIUM_copy_texture_to_parent_texture requires the + // desktopGL-only function glGetTexLevelParameteriv (GLES2 + // doesn't support it). + if (!m_isGLES2) + result.append(" GL_CHROMIUM_copy_texture_to_parent_texture"); + } + return WebString(result.toString()); +} + +DELEGATE_TO_GL_3(getTexParameterfv, GetTexParameterfv, unsigned long, unsigned long, float*) + +DELEGATE_TO_GL_3(getTexParameteriv, GetTexParameteriv, unsigned long, unsigned long, int*) + +DELEGATE_TO_GL_3(getUniformfv, GetUniformfv, WebGLId, long, float*) + +DELEGATE_TO_GL_3(getUniformiv, GetUniformiv, WebGLId, long, int*) + +DELEGATE_TO_GL_2R(getUniformLocation, GetUniformLocation, WebGLId, const char*, long) + +DELEGATE_TO_GL_3(getVertexAttribfv, GetVertexAttribfv, unsigned long, unsigned long, float*) + +DELEGATE_TO_GL_3(getVertexAttribiv, GetVertexAttribiv, unsigned long, unsigned long, int*) + +long WebGraphicsContext3DDefaultImpl::getVertexAttribOffset(unsigned long index, unsigned long pname) +{ + makeContextCurrent(); + void* pointer; + glGetVertexAttribPointerv(index, pname, &pointer); + return reinterpret_cast<long>(pointer); +} + +DELEGATE_TO_GL_2(hint, Hint, unsigned long, unsigned long) + +DELEGATE_TO_GL_1R(isBuffer, IsBuffer, WebGLId, bool) + +DELEGATE_TO_GL_1R(isEnabled, IsEnabled, unsigned long, bool) + +DELEGATE_TO_GL_1R(isFramebuffer, IsFramebufferEXT, WebGLId, bool) + +DELEGATE_TO_GL_1R(isProgram, IsProgram, WebGLId, bool) + +DELEGATE_TO_GL_1R(isRenderbuffer, IsRenderbufferEXT, WebGLId, bool) + +DELEGATE_TO_GL_1R(isShader, IsShader, WebGLId, bool) + +DELEGATE_TO_GL_1R(isTexture, IsTexture, WebGLId, bool) + +DELEGATE_TO_GL_1(lineWidth, LineWidth, double) + +DELEGATE_TO_GL_1(linkProgram, LinkProgram, WebGLId) + +DELEGATE_TO_GL_2(pixelStorei, PixelStorei, unsigned long, long) + +DELEGATE_TO_GL_2(polygonOffset, PolygonOffset, double, double) + +void WebGraphicsContext3DDefaultImpl::readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* pixels) +{ + makeContextCurrent(); + // FIXME: remove the two glFlush calls when the driver bug is fixed, i.e., + // all previous rendering calls should be done before reading pixels. + glFlush(); + bool needsResolve = (m_attributes.antialias && m_boundFBO == m_multisampleFBO); + if (needsResolve) { + resolveMultisampledFramebuffer(x, y, width, height); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); + glFlush(); + } + + glReadPixels(x, y, width, height, format, type, pixels); + + if (needsResolve) + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); +} + +void WebGraphicsContext3DDefaultImpl::releaseShaderCompiler() +{ +} + +void WebGraphicsContext3DDefaultImpl::renderbufferStorage(unsigned long target, + unsigned long internalformat, + unsigned long width, + unsigned long height) +{ + makeContextCurrent(); + switch (internalformat) { + case GL_DEPTH_STENCIL: + internalformat = GL_DEPTH24_STENCIL8_EXT; + break; + case GL_DEPTH_COMPONENT16: + internalformat = GL_DEPTH_COMPONENT; + break; + case GL_RGBA4: + case GL_RGB5_A1: + internalformat = GL_RGBA; + break; + case 0x8D62: // GL_RGB565 + internalformat = GL_RGB; + break; + } + glRenderbufferStorageEXT(target, internalformat, width, height); +} + +DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, double, bool) + +DELEGATE_TO_GL_4(scissor, Scissor, long, long, unsigned long, unsigned long) + +unsigned bytesPerComponent(unsigned type) +{ + switch (type) { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + return 1; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_UNSIGNED_SHORT_5_6_5: + case GL_UNSIGNED_SHORT_4_4_4_4: + case GL_UNSIGNED_SHORT_5_5_5_1: + return 2; + case GL_FLOAT: + return 4; + default: + return 4; + } +} + +unsigned componentsPerPixel(unsigned format, unsigned type) +{ + switch (type) { + case GL_UNSIGNED_SHORT_5_6_5: + case GL_UNSIGNED_SHORT_4_4_4_4: + case GL_UNSIGNED_SHORT_5_5_5_1: + return 1; + default: + break; + } + switch (format) { + case GL_LUMINANCE: + return 1; + case GL_LUMINANCE_ALPHA: + return 2; + case GL_RGB: + return 3; + case GL_RGBA: + case GL_BGRA_EXT: + return 4; + default: + return 4; + } +} + +// N.B.: This code does not protect against integer overflow (as the command +// buffer implementation does), so it should not be considered robust enough +// for use in the browser. Since this implementation is only used for layout +// tests, this should be ok for now. +size_t imageSizeInBytes(unsigned width, unsigned height, unsigned format, unsigned type) +{ + return width * height * bytesPerComponent(type) * componentsPerPixel(format, type); +} + +void WebGraphicsContext3DDefaultImpl::texImage2D(unsigned target, unsigned level, unsigned internalFormat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, const void* pixels) +{ + OwnArrayPtr<uint8> zero; + if (!pixels) { + size_t size = imageSizeInBytes(width, height, format, type); + zero.set(new uint8[size]); + memset(zero.get(), 0, size); + pixels = zero.get(); + } + glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels); +} + +void WebGraphicsContext3DDefaultImpl::shaderSource(WebGLId shader, const char* string) +{ + makeContextCurrent(); + GLint length = string ? strlen(string) : 0; + ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader); + if (result != m_shaderSourceMap.end()) { + ShaderSourceEntry* entry = result->second; + ASSERT(entry); + if (entry->source) { + fastFree(entry->source); + entry->source = 0; + } + if (!tryFastMalloc((length + 1) * sizeof(char)).getValue(entry->source)) + return; // FIXME: generate an error? + memcpy(entry->source, string, (length + 1) * sizeof(char)); + } else + glShaderSource(shader, 1, &string, &length); +} + +DELEGATE_TO_GL_3(stencilFunc, StencilFunc, unsigned long, long, unsigned long) + +DELEGATE_TO_GL_4(stencilFuncSeparate, StencilFuncSeparate, unsigned long, unsigned long, long, unsigned long) + +DELEGATE_TO_GL_1(stencilMask, StencilMask, unsigned long) + +DELEGATE_TO_GL_2(stencilMaskSeparate, StencilMaskSeparate, unsigned long, unsigned long) + +DELEGATE_TO_GL_3(stencilOp, StencilOp, unsigned long, unsigned long, unsigned long) + +DELEGATE_TO_GL_4(stencilOpSeparate, StencilOpSeparate, unsigned long, unsigned long, unsigned long, unsigned long) + +DELEGATE_TO_GL_3(texParameterf, TexParameterf, unsigned, unsigned, float); + +DELEGATE_TO_GL_3(texParameteri, TexParameteri, unsigned, unsigned, int); + +DELEGATE_TO_GL_9(texSubImage2D, TexSubImage2D, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, const void*) + +DELEGATE_TO_GL_2(uniform1f, Uniform1f, long, float) + +DELEGATE_TO_GL_3(uniform1fv, Uniform1fv, long, int, float*) + +DELEGATE_TO_GL_2(uniform1i, Uniform1i, long, int) + +DELEGATE_TO_GL_3(uniform1iv, Uniform1iv, long, int, int*) + +DELEGATE_TO_GL_3(uniform2f, Uniform2f, long, float, float) + +DELEGATE_TO_GL_3(uniform2fv, Uniform2fv, long, int, float*) + +DELEGATE_TO_GL_3(uniform2i, Uniform2i, long, int, int) + +DELEGATE_TO_GL_3(uniform2iv, Uniform2iv, long, int, int*) + +DELEGATE_TO_GL_4(uniform3f, Uniform3f, long, float, float, float) + +DELEGATE_TO_GL_3(uniform3fv, Uniform3fv, long, int, float*) + +DELEGATE_TO_GL_4(uniform3i, Uniform3i, long, int, int, int) + +DELEGATE_TO_GL_3(uniform3iv, Uniform3iv, long, int, int*) + +DELEGATE_TO_GL_5(uniform4f, Uniform4f, long, float, float, float, float) + +DELEGATE_TO_GL_3(uniform4fv, Uniform4fv, long, int, float*) + +DELEGATE_TO_GL_5(uniform4i, Uniform4i, long, int, int, int, int) + +DELEGATE_TO_GL_3(uniform4iv, Uniform4iv, long, int, int*) + +DELEGATE_TO_GL_4(uniformMatrix2fv, UniformMatrix2fv, long, int, bool, const float*) + +DELEGATE_TO_GL_4(uniformMatrix3fv, UniformMatrix3fv, long, int, bool, const float*) + +DELEGATE_TO_GL_4(uniformMatrix4fv, UniformMatrix4fv, long, int, bool, const float*) + +DELEGATE_TO_GL_1(useProgram, UseProgram, WebGLId) + +DELEGATE_TO_GL_1(validateProgram, ValidateProgram, WebGLId) + +DELEGATE_TO_GL_2(vertexAttrib1f, VertexAttrib1f, unsigned long, float) + +DELEGATE_TO_GL_2(vertexAttrib1fv, VertexAttrib1fv, unsigned long, const float*) + +DELEGATE_TO_GL_3(vertexAttrib2f, VertexAttrib2f, unsigned long, float, float) + +DELEGATE_TO_GL_2(vertexAttrib2fv, VertexAttrib2fv, unsigned long, const float*) + +DELEGATE_TO_GL_4(vertexAttrib3f, VertexAttrib3f, unsigned long, float, float, float) + +DELEGATE_TO_GL_2(vertexAttrib3fv, VertexAttrib3fv, unsigned long, const float*) + +DELEGATE_TO_GL_5(vertexAttrib4f, VertexAttrib4f, unsigned long, float, float, float, float) + +DELEGATE_TO_GL_2(vertexAttrib4fv, VertexAttrib4fv, unsigned long, const float*) + +void WebGraphicsContext3DDefaultImpl::vertexAttribPointer(unsigned long indx, int size, int type, bool normalized, + unsigned long stride, unsigned long offset) +{ + makeContextCurrent(); + + if (m_boundArrayBuffer <= 0) { + // FIXME: raise exception. + // LogMessagef(("bufferData: no buffer bound")); + return; + } + + if (indx < NumTrackedPointerStates) { + VertexAttribPointerState& state = m_vertexAttribPointerState[indx]; + state.buffer = m_boundArrayBuffer; + state.indx = indx; + state.size = size; + state.type = type; + state.normalized = normalized; + state.stride = stride; + state.offset = offset; + } + + glVertexAttribPointer(indx, size, type, normalized, stride, + reinterpret_cast<void*>(static_cast<intptr_t>(offset))); +} + +DELEGATE_TO_GL_4(viewport, Viewport, long, long, unsigned long, unsigned long) + +unsigned WebGraphicsContext3DDefaultImpl::createBuffer() +{ + makeContextCurrent(); + GLuint o; + glGenBuffersARB(1, &o); + return o; +} + +unsigned WebGraphicsContext3DDefaultImpl::createFramebuffer() +{ + makeContextCurrent(); + GLuint o = 0; + glGenFramebuffersEXT(1, &o); + return o; +} + +unsigned WebGraphicsContext3DDefaultImpl::createProgram() +{ + makeContextCurrent(); + return glCreateProgram(); +} + +unsigned WebGraphicsContext3DDefaultImpl::createRenderbuffer() +{ + makeContextCurrent(); + GLuint o; + glGenRenderbuffersEXT(1, &o); + return o; +} + +unsigned WebGraphicsContext3DDefaultImpl::createShader(unsigned long shaderType) +{ + makeContextCurrent(); + ASSERT(shaderType == GL_VERTEX_SHADER || shaderType == GL_FRAGMENT_SHADER); + unsigned shader = glCreateShader(shaderType); + if (shader) { + ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader); + if (result != m_shaderSourceMap.end()) + delete result->second; + m_shaderSourceMap.set(shader, new ShaderSourceEntry(shaderType)); + } + + return shader; +} + +unsigned WebGraphicsContext3DDefaultImpl::createTexture() +{ + makeContextCurrent(); + GLuint o; + glGenTextures(1, &o); + return o; +} + +void WebGraphicsContext3DDefaultImpl::deleteBuffer(unsigned buffer) +{ + makeContextCurrent(); + glDeleteBuffersARB(1, &buffer); +} + +void WebGraphicsContext3DDefaultImpl::deleteFramebuffer(unsigned framebuffer) +{ + makeContextCurrent(); + glDeleteFramebuffersEXT(1, &framebuffer); +} + +void WebGraphicsContext3DDefaultImpl::deleteProgram(unsigned program) +{ + makeContextCurrent(); + glDeleteProgram(program); +} + +void WebGraphicsContext3DDefaultImpl::deleteRenderbuffer(unsigned renderbuffer) +{ + makeContextCurrent(); + glDeleteRenderbuffersEXT(1, &renderbuffer); +} + +void WebGraphicsContext3DDefaultImpl::deleteShader(unsigned shader) +{ + makeContextCurrent(); + + ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader); + if (result != m_shaderSourceMap.end()) + delete result->second; + m_shaderSourceMap.remove(result); + glDeleteShader(shader); +} + +void WebGraphicsContext3DDefaultImpl::deleteTexture(unsigned texture) +{ + makeContextCurrent(); + glDeleteTextures(1, &texture); +} + +bool WebGraphicsContext3DDefaultImpl::angleCreateCompilers() +{ + if (!ShInitialize()) + return false; + + ShBuiltInResources resources; + ShInitBuiltInResources(&resources); + getIntegerv(GL_MAX_VERTEX_ATTRIBS, &resources.MaxVertexAttribs); + getIntegerv(MAX_VERTEX_UNIFORM_VECTORS, &resources.MaxVertexUniformVectors); + getIntegerv(MAX_VARYING_VECTORS, &resources.MaxVaryingVectors); + getIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &resources.MaxVertexTextureImageUnits); + getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &resources.MaxCombinedTextureImageUnits); + getIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &resources.MaxTextureImageUnits); + getIntegerv(MAX_FRAGMENT_UNIFORM_VECTORS, &resources.MaxFragmentUniformVectors); + // Always set to 1 for OpenGL ES. + resources.MaxDrawBuffers = 1; + + m_fragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, SH_WEBGL_SPEC, &resources); + m_vertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, SH_WEBGL_SPEC, &resources); + return (m_fragmentCompiler && m_vertexCompiler); +} + +void WebGraphicsContext3DDefaultImpl::angleDestroyCompilers() +{ + if (m_fragmentCompiler) { + ShDestruct(m_fragmentCompiler); + m_fragmentCompiler = 0; + } + if (m_vertexCompiler) { + ShDestruct(m_vertexCompiler); + m_vertexCompiler = 0; + } +} + +bool WebGraphicsContext3DDefaultImpl::angleValidateShaderSource(ShaderSourceEntry& entry) +{ + entry.isValid = false; + if (entry.translatedSource) { + fastFree(entry.translatedSource); + entry.translatedSource = 0; + } + if (entry.log) { + fastFree(entry.log); + entry.log = 0; + } + + ShHandle compiler = 0; + switch (entry.type) { + case GL_FRAGMENT_SHADER: + compiler = m_fragmentCompiler; + break; + case GL_VERTEX_SHADER: + compiler = m_vertexCompiler; + break; + } + if (!compiler) + return false; + + if (!ShCompile(compiler, &entry.source, 1, SH_OBJECT_CODE)) { + int logSize = 0; + ShGetInfo(compiler, SH_INFO_LOG_LENGTH, &logSize); + if (logSize > 1 && tryFastMalloc(logSize * sizeof(char)).getValue(entry.log)) + ShGetInfoLog(compiler, entry.log); + return false; + } + + int length = 0; + if (m_isGLES2) { + // ANGLE does not yet have a GLSL ES backend. Therefore if the + // compile succeeds we send the original source down. + length = strlen(entry.source); + if (length > 0) + ++length; // Add null terminator + } else + ShGetInfo(compiler, SH_OBJECT_CODE_LENGTH, &length); + if (length > 1) { + if (!tryFastMalloc(length * sizeof(char)).getValue(entry.translatedSource)) + return false; + if (m_isGLES2) + strncpy(entry.translatedSource, entry.source, length); + else + ShGetObjectCode(compiler, entry.translatedSource); + } + entry.isValid = true; + return true; +} + +} // namespace WebKit + +#endif // ENABLE(3D_CANVAS) diff --git a/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.h b/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.h new file mode 100644 index 0000000..32e3671 --- /dev/null +++ b/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.h @@ -0,0 +1,383 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WebGraphicsContext3DDefaultImpl_h +#define WebGraphicsContext3DDefaultImpl_h + +#if ENABLE(3D_CANVAS) + +#include "GLSLANG/ShaderLang.h" +#include "WebGraphicsContext3D.h" + +#include <wtf/HashMap.h> +#include <wtf/ListHashSet.h> +#include <wtf/OwnPtr.h> + +#if !PLATFORM(CG) +#define FLIP_FRAMEBUFFER_VERTICALLY +#endif +namespace gfx { +class GLContext; +} + +namespace WebKit { + +// The default implementation of WebGL. In Chromium, using this class +// requires the sandbox to be disabled, which is strongly discouraged. +// It is provided for support of test_shell and any Chromium ports +// where an in-renderer WebGL implementation would be helpful. + +class WebGraphicsContext3DDefaultImpl : public WebGraphicsContext3D { +public: + WebGraphicsContext3DDefaultImpl(); + virtual ~WebGraphicsContext3DDefaultImpl(); + + //---------------------------------------------------------------------- + // WebGraphicsContext3D methods + virtual bool initialize(WebGraphicsContext3D::Attributes attributes, WebView*, bool); + virtual bool makeContextCurrent(); + + virtual int width(); + virtual int height(); + + virtual int sizeInBytes(int type); + + virtual bool isGLES2Compliant(); + + virtual void reshape(int width, int height); + + virtual bool readBackFramebuffer(unsigned char* pixels, size_t bufferSize); + + virtual unsigned int getPlatformTextureId(); + virtual void prepareTexture(); + + virtual void synthesizeGLError(unsigned long error); + virtual void* mapBufferSubDataCHROMIUM(unsigned target, int offset, int size, unsigned access); + virtual void unmapBufferSubDataCHROMIUM(const void*); + virtual void* mapTexSubImage2DCHROMIUM(unsigned target, int level, int xoffset, int yoffset, int width, int height, unsigned format, unsigned type, unsigned access); + virtual void unmapTexSubImage2DCHROMIUM(const void*); + virtual void copyTextureToParentTextureCHROMIUM(unsigned texture, unsigned parentTexture); + + virtual void activeTexture(unsigned long texture); + virtual void attachShader(WebGLId program, WebGLId shader); + virtual void bindAttribLocation(WebGLId program, unsigned long index, const char* name); + virtual void bindBuffer(unsigned long target, WebGLId buffer); + virtual void bindFramebuffer(unsigned long target, WebGLId framebuffer); + virtual void bindRenderbuffer(unsigned long target, WebGLId renderbuffer); + virtual void bindTexture(unsigned long target, WebGLId texture); + virtual void blendColor(double red, double green, double blue, double alpha); + virtual void blendEquation(unsigned long mode); + virtual void blendEquationSeparate(unsigned long modeRGB, unsigned long modeAlpha); + virtual void blendFunc(unsigned long sfactor, unsigned long dfactor); + virtual void blendFuncSeparate(unsigned long srcRGB, unsigned long dstRGB, unsigned long srcAlpha, unsigned long dstAlpha); + + virtual void bufferData(unsigned long target, int size, const void* data, unsigned long usage); + virtual void bufferSubData(unsigned long target, long offset, int size, const void* data); + + virtual unsigned long checkFramebufferStatus(unsigned long target); + virtual void clear(unsigned long mask); + virtual void clearColor(double red, double green, double blue, double alpha); + virtual void clearDepth(double depth); + virtual void clearStencil(long s); + virtual void colorMask(bool red, bool green, bool blue, bool alpha); + virtual void compileShader(WebGLId shader); + + virtual void copyTexImage2D(unsigned long target, long level, unsigned long internalformat, long x, long y, unsigned long width, unsigned long height, long border); + virtual void copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, long x, long y, unsigned long width, unsigned long height); + virtual void cullFace(unsigned long mode); + virtual void depthFunc(unsigned long func); + virtual void depthMask(bool flag); + virtual void depthRange(double zNear, double zFar); + virtual void detachShader(WebGLId program, WebGLId shader); + virtual void disable(unsigned long cap); + virtual void disableVertexAttribArray(unsigned long index); + virtual void drawArrays(unsigned long mode, long first, long count); + virtual void drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset); + + virtual void enable(unsigned long cap); + virtual void enableVertexAttribArray(unsigned long index); + virtual void finish(); + virtual void flush(); + virtual void framebufferRenderbuffer(unsigned long target, unsigned long attachment, unsigned long renderbuffertarget, WebGLId renderbuffer); + virtual void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, WebGLId texture, long level); + virtual void frontFace(unsigned long mode); + virtual void generateMipmap(unsigned long target); + + virtual bool getActiveAttrib(WebGLId program, unsigned long index, ActiveInfo&); + virtual bool getActiveUniform(WebGLId program, unsigned long index, ActiveInfo&); + + virtual void getAttachedShaders(WebGLId program, int maxCount, int* count, unsigned int* shaders); + + virtual int getAttribLocation(WebGLId program, const char* name); + + virtual void getBooleanv(unsigned long pname, unsigned char* value); + + virtual void getBufferParameteriv(unsigned long target, unsigned long pname, int* value); + + virtual Attributes getContextAttributes(); + + virtual unsigned long getError(); + + virtual bool isContextLost(); + + virtual void getFloatv(unsigned long pname, float* value); + + virtual void getFramebufferAttachmentParameteriv(unsigned long target, unsigned long attachment, unsigned long pname, int* value); + + virtual void getIntegerv(unsigned long pname, int* value); + + virtual void getProgramiv(WebGLId program, unsigned long pname, int* value); + + virtual WebString getProgramInfoLog(WebGLId program); + + virtual void getRenderbufferParameteriv(unsigned long target, unsigned long pname, int* value); + + virtual void getShaderiv(WebGLId shader, unsigned long pname, int* value); + + virtual WebString getShaderInfoLog(WebGLId shader); + + // TBD + // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); + + virtual WebString getShaderSource(WebGLId shader); + virtual WebString getString(unsigned long name); + + virtual void getTexParameterfv(unsigned long target, unsigned long pname, float* value); + virtual void getTexParameteriv(unsigned long target, unsigned long pname, int* value); + + virtual void getUniformfv(WebGLId program, long location, float* value); + virtual void getUniformiv(WebGLId program, long location, int* value); + + virtual long getUniformLocation(WebGLId program, const char* name); + + virtual void getVertexAttribfv(unsigned long index, unsigned long pname, float* value); + virtual void getVertexAttribiv(unsigned long index, unsigned long pname, int* value); + + virtual long getVertexAttribOffset(unsigned long index, unsigned long pname); + + virtual void hint(unsigned long target, unsigned long mode); + virtual bool isBuffer(WebGLId buffer); + virtual bool isEnabled(unsigned long cap); + virtual bool isFramebuffer(WebGLId framebuffer); + virtual bool isProgram(WebGLId program); + virtual bool isRenderbuffer(WebGLId renderbuffer); + virtual bool isShader(WebGLId shader); + virtual bool isTexture(WebGLId texture); + virtual void lineWidth(double); + virtual void linkProgram(WebGLId program); + virtual void pixelStorei(unsigned long pname, long param); + virtual void polygonOffset(double factor, double units); + + virtual void readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* pixels); + + virtual void releaseShaderCompiler(); + virtual void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height); + virtual void sampleCoverage(double value, bool invert); + virtual void scissor(long x, long y, unsigned long width, unsigned long height); + virtual void shaderSource(WebGLId shader, const char* string); + virtual void stencilFunc(unsigned long func, long ref, unsigned long mask); + virtual void stencilFuncSeparate(unsigned long face, unsigned long func, long ref, unsigned long mask); + virtual void stencilMask(unsigned long mask); + virtual void stencilMaskSeparate(unsigned long face, unsigned long mask); + virtual void stencilOp(unsigned long fail, unsigned long zfail, unsigned long zpass); + virtual void stencilOpSeparate(unsigned long face, unsigned long fail, unsigned long zfail, unsigned long zpass); + + virtual void texImage2D(unsigned target, unsigned level, unsigned internalformat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, const void* pixels); + + virtual void texParameterf(unsigned target, unsigned pname, float param); + virtual void texParameteri(unsigned target, unsigned pname, int param); + + virtual void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, unsigned format, unsigned type, const void* pixels); + + virtual void uniform1f(long location, float x); + virtual void uniform1fv(long location, int count, float* v); + virtual void uniform1i(long location, int x); + virtual void uniform1iv(long location, int count, int* v); + virtual void uniform2f(long location, float x, float y); + virtual void uniform2fv(long location, int count, float* v); + virtual void uniform2i(long location, int x, int y); + virtual void uniform2iv(long location, int count, int* v); + virtual void uniform3f(long location, float x, float y, float z); + virtual void uniform3fv(long location, int count, float* v); + virtual void uniform3i(long location, int x, int y, int z); + virtual void uniform3iv(long location, int count, int* v); + virtual void uniform4f(long location, float x, float y, float z, float w); + virtual void uniform4fv(long location, int count, float* v); + virtual void uniform4i(long location, int x, int y, int z, int w); + virtual void uniform4iv(long location, int count, int* v); + virtual void uniformMatrix2fv(long location, int count, bool transpose, const float* value); + virtual void uniformMatrix3fv(long location, int count, bool transpose, const float* value); + virtual void uniformMatrix4fv(long location, int count, bool transpose, const float* value); + + virtual void useProgram(WebGLId program); + virtual void validateProgram(WebGLId program); + + virtual void vertexAttrib1f(unsigned long indx, float x); + virtual void vertexAttrib1fv(unsigned long indx, const float* values); + virtual void vertexAttrib2f(unsigned long indx, float x, float y); + virtual void vertexAttrib2fv(unsigned long indx, const float* values); + virtual void vertexAttrib3f(unsigned long indx, float x, float y, float z); + virtual void vertexAttrib3fv(unsigned long indx, const float* values); + virtual void vertexAttrib4f(unsigned long indx, float x, float y, float z, float w); + virtual void vertexAttrib4fv(unsigned long indx, const float* values); + virtual void vertexAttribPointer(unsigned long indx, int size, int type, bool normalized, + unsigned long stride, unsigned long offset); + + virtual void viewport(long x, long y, unsigned long width, unsigned long height); + + // Support for buffer creation and deletion + virtual unsigned createBuffer(); + virtual unsigned createFramebuffer(); + virtual unsigned createProgram(); + virtual unsigned createRenderbuffer(); + virtual unsigned createShader(unsigned long); + virtual unsigned createTexture(); + + virtual void deleteBuffer(unsigned); + virtual void deleteFramebuffer(unsigned); + virtual void deleteProgram(unsigned); + virtual void deleteRenderbuffer(unsigned); + virtual void deleteShader(unsigned); + virtual void deleteTexture(unsigned); + +private: + WebGraphicsContext3D::Attributes m_attributes; + bool m_initialized; + bool m_renderDirectlyToWebView; + bool m_isGLES2; + bool m_haveEXTFramebufferObject; + bool m_haveEXTFramebufferMultisample; + bool m_haveANGLEFramebufferMultisample; + + unsigned int m_texture; + unsigned int m_fbo; + unsigned int m_depthStencilBuffer; + unsigned int m_cachedWidth, m_cachedHeight; + + // For multisampling + unsigned int m_multisampleFBO; + unsigned int m_multisampleDepthStencilBuffer; + unsigned int m_multisampleColorBuffer; + + // For tracking which FBO is bound + unsigned int m_boundFBO; + + // For tracking which texture is bound + unsigned int m_boundTexture; + + // FBO used for copying child texture to parent texture. + unsigned m_copyTextureToParentTextureFBO; + +#ifdef FLIP_FRAMEBUFFER_VERTICALLY + unsigned char* m_scanline; + void flipVertically(unsigned char* framebuffer, + unsigned int width, + unsigned int height); +#endif + + // Take into account the user's requested context creation attributes, in + // particular stencil and antialias, and determine which could or could + // not be honored based on the capabilities of the OpenGL implementation. + void validateAttributes(); + + // Resolve the given rectangle of the multisampled framebuffer if necessary. + void resolveMultisampledFramebuffer(unsigned x, unsigned y, unsigned width, unsigned height); + + // Note: we aren't currently using this information, but we will + // need to in order to verify that all enabled vertex arrays have + // a valid buffer bound -- to avoid crashes on certain cards. + unsigned int m_boundArrayBuffer; + struct VertexAttribPointerState { + VertexAttribPointerState(); + + bool enabled; + unsigned long buffer; + unsigned long indx; + int size; + int type; + bool normalized; + unsigned long stride; + unsigned long offset; + }; + + enum { + NumTrackedPointerStates = 2 + }; + VertexAttribPointerState m_vertexAttribPointerState[NumTrackedPointerStates]; + + // Errors raised by synthesizeGLError(). + ListHashSet<unsigned long> m_syntheticErrors; + + OwnPtr<gfx::GLContext> m_glContext; + + // ANGLE related. + struct ShaderSourceEntry { + ShaderSourceEntry(unsigned long shaderType) + : type(shaderType) + , source(0) + , log(0) + , translatedSource(0) + , isValid(false) + { + } + + ~ShaderSourceEntry() + { + if (source) + fastFree(source); + if (log) + fastFree(log); + if (translatedSource) + fastFree(translatedSource); + } + + unsigned long type; + char* source; + char* log; + char* translatedSource; + bool isValid; + }; + + bool angleCreateCompilers(); + void angleDestroyCompilers(); + bool angleValidateShaderSource(ShaderSourceEntry& entry); + + typedef HashMap<WebGLId, ShaderSourceEntry*> ShaderSourceMap; + ShaderSourceMap m_shaderSourceMap; + + ShHandle m_fragmentCompiler; + ShHandle m_vertexCompiler; +}; + +} // namespace WebKit + +#endif // ENABLE(3D_CANVAS) + +#endif diff --git a/WebKit/chromium/src/WebHTTPBody.cpp b/WebKit/chromium/src/WebHTTPBody.cpp index 3d40869..f32b64f 100644 --- a/WebKit/chromium/src/WebHTTPBody.cpp +++ b/WebKit/chromium/src/WebHTTPBody.cpp @@ -32,7 +32,6 @@ #include "WebHTTPBody.h" #include "FormData.h" -#include "WebFileInfo.h" using namespace WebCore; @@ -74,23 +73,33 @@ bool WebHTTPBody::elementAt(size_t index, Element& result) const const FormDataElement& element = m_private->elements()[index]; + result.data.reset(); + result.filePath.reset(); + result.fileStart = 0; + result.fileLength = 0; + result.modificationTime = 0.0; + result.blobURL = KURL(); + switch (element.m_type) { case FormDataElement::data: result.type = Element::TypeData; result.data.assign(element.m_data.data(), element.m_data.size()); - result.filePath.reset(); - result.fileStart = 0; - result.fileLength = 0; - result.fileInfo.modificationTime = 0.0; break; case FormDataElement::encodedFile: result.type = Element::TypeFile; - result.data.reset(); result.filePath = element.m_filename; - result.fileStart = 0; // FIXME: to be set from FormData. - result.fileLength = -1; // FIXME: to be set from FormData. - result.fileInfo.modificationTime = 0.0; // FIXME: to be set from FormData. +#if ENABLE(BLOB) + result.fileStart = element.m_fileStart; + result.fileLength = element.m_fileLength; + result.modificationTime = element.m_expectedFileModificationTime; +#endif + break; +#if ENABLE(BLOB) + case FormDataElement::encodedBlob: + result.type = Element::TypeBlob; + result.blobURL = element.m_blobURL; break; +#endif default: ASSERT_NOT_REACHED(); return false; @@ -113,9 +122,20 @@ void WebHTTPBody::appendFile(const WebString& filePath) m_private->appendFile(filePath); } -void WebHTTPBody::appendFile(const WebString& filePath, long long fileStart, long long fileLength, const WebFileInfo& fileInfo) +void WebHTTPBody::appendFileRange(const WebString& filePath, long long fileStart, long long fileLength, double modificationTime) { - // FIXME: to be implemented. +#if ENABLE(BLOB) + ensureMutable(); + m_private->appendFileRange(filePath, fileStart, fileLength, modificationTime); +#endif +} + +void WebHTTPBody::appendBlob(const WebURL& blobURL) +{ +#if ENABLE(BLOB) + ensureMutable(); + m_private->appendBlob(blobURL); +#endif } long long WebHTTPBody::identifier() const diff --git a/WebKit/chromium/src/WebHTTPLoadInfo.cpp b/WebKit/chromium/src/WebHTTPLoadInfo.cpp new file mode 100644 index 0000000..876a489 --- /dev/null +++ b/WebKit/chromium/src/WebHTTPLoadInfo.cpp @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebHTTPLoadInfo.h" + +#include "ResourceLoadInfo.h" +#include "ResourceResponse.h" +#include "WebHTTPHeaderVisitor.h" +#include "WebString.h" + +using namespace WebCore; + +namespace WebKit { + +void WebHTTPLoadInfo::initialize() +{ + m_private = adoptRef(new ResourceLoadInfo()); +} + +void WebHTTPLoadInfo::reset() +{ + m_private.reset(); +} + +void WebHTTPLoadInfo::assign(const WebHTTPLoadInfo& r) +{ + m_private = r.m_private; +} + +WebHTTPLoadInfo::WebHTTPLoadInfo(WTF::PassRefPtr<WebCore::ResourceLoadInfo> value) +{ + m_private = value; +} + +WebHTTPLoadInfo::operator WTF::PassRefPtr<WebCore::ResourceLoadInfo>() const +{ + return m_private.get(); +} + +int WebHTTPLoadInfo::httpStatusCode() const +{ + ASSERT(!m_private.isNull()); + return m_private->httpStatusCode; +} + +void WebHTTPLoadInfo::setHTTPStatusCode(int statusCode) +{ + ASSERT(!m_private.isNull()); + m_private->httpStatusCode = statusCode; +} + +WebString WebHTTPLoadInfo::httpStatusText() const +{ + ASSERT(!m_private.isNull()); + return m_private->httpStatusText; +} + +void WebHTTPLoadInfo::setHTTPStatusText(const WebString& statusText) +{ + ASSERT(!m_private.isNull()); + m_private->httpStatusText = statusText; +} + +static void addHeader(HTTPHeaderMap* map, const WebString& name, const WebString& value) +{ + pair<HTTPHeaderMap::iterator, bool> result = map->add(name, value); + if (!result.second) + result.first->second += String("\n") + value; +} + +void WebHTTPLoadInfo::addRequestHeader(const WebString& name, const WebString& value) +{ + ASSERT(!m_private.isNull()); + addHeader(&m_private->requestHeaders, name, value); +} + +void WebHTTPLoadInfo::addResponseHeader(const WebString& name, const WebString& value) +{ + ASSERT(!m_private.isNull()); + addHeader(&m_private->responseHeaders, name, value); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebHistoryItem.cpp b/WebKit/chromium/src/WebHistoryItem.cpp index 4ca8cc7..99ebce8 100644 --- a/WebKit/chromium/src/WebHistoryItem.cpp +++ b/WebKit/chromium/src/WebHistoryItem.cpp @@ -37,6 +37,7 @@ #include "WebHTTPBody.h" #include "WebPoint.h" +#include "WebSerializedScriptValue.h" #include "WebString.h" #include "WebVector.h" @@ -44,30 +45,23 @@ using namespace WebCore; namespace WebKit { -class WebHistoryItemPrivate : public HistoryItem { -}; - void WebHistoryItem::initialize() { - assign(static_cast<WebHistoryItemPrivate*>(HistoryItem::create().releaseRef())); + m_private = HistoryItem::create(); } void WebHistoryItem::reset() { - assign(0); + m_private.reset(); } void WebHistoryItem::assign(const WebHistoryItem& other) { - WebHistoryItemPrivate* p = const_cast<WebHistoryItemPrivate*>(other.m_private); - if (p) - p->ref(); - assign(p); + m_private = other.m_private; } WebString WebHistoryItem::urlString() const { - ASSERT(!isNull()); return m_private->urlString(); } @@ -79,7 +73,6 @@ void WebHistoryItem::setURLString(const WebString& url) WebString WebHistoryItem::originalURLString() const { - ASSERT(!isNull()); return m_private->originalURLString(); } @@ -91,7 +84,6 @@ void WebHistoryItem::setOriginalURLString(const WebString& originalURLString) WebString WebHistoryItem::referrer() const { - ASSERT(!isNull()); return m_private->referrer(); } @@ -103,7 +95,6 @@ void WebHistoryItem::setReferrer(const WebString& referrer) WebString WebHistoryItem::target() const { - ASSERT(!isNull()); return m_private->target(); } @@ -115,7 +106,6 @@ void WebHistoryItem::setTarget(const WebString& target) WebString WebHistoryItem::parent() const { - ASSERT(!isNull()); return m_private->parent(); } @@ -127,7 +117,6 @@ void WebHistoryItem::setParent(const WebString& parent) WebString WebHistoryItem::title() const { - ASSERT(!isNull()); return m_private->title(); } @@ -139,7 +128,6 @@ void WebHistoryItem::setTitle(const WebString& title) WebString WebHistoryItem::alternateTitle() const { - ASSERT(!isNull()); return m_private->alternateTitle(); } @@ -151,7 +139,6 @@ void WebHistoryItem::setAlternateTitle(const WebString& alternateTitle) double WebHistoryItem::lastVisitedTime() const { - ASSERT(!isNull()); return m_private->lastVisitedTime(); } @@ -168,7 +155,6 @@ void WebHistoryItem::setLastVisitedTime(double lastVisitedTime) WebPoint WebHistoryItem::scrollOffset() const { - ASSERT(!isNull()); return m_private->scrollPoint(); } @@ -180,7 +166,6 @@ void WebHistoryItem::setScrollOffset(const WebPoint& scrollOffset) bool WebHistoryItem::isTargetItem() const { - ASSERT(!isNull()); return m_private->isTargetItem(); } @@ -192,7 +177,6 @@ void WebHistoryItem::setIsTargetItem(bool isTargetItem) int WebHistoryItem::visitCount() const { - ASSERT(!isNull()); return m_private->visitCount(); } @@ -204,7 +188,6 @@ void WebHistoryItem::setVisitCount(int count) WebVector<WebString> WebHistoryItem::documentState() const { - ASSERT(!isNull()); return m_private->documentState(); } @@ -218,9 +201,19 @@ void WebHistoryItem::setDocumentState(const WebVector<WebString>& state) m_private->setDocumentState(ds); } +long long WebHistoryItem::itemSequenceNumber() const +{ + return m_private->itemSequenceNumber(); +} + +void WebHistoryItem::setItemSequenceNumber(long long itemSequenceNumber) +{ + ensureMutable(); + m_private->setItemSequenceNumber(itemSequenceNumber); +} + long long WebHistoryItem::documentSequenceNumber() const { - ASSERT(!isNull()); return m_private->documentSequenceNumber(); } @@ -230,9 +223,19 @@ void WebHistoryItem::setDocumentSequenceNumber(long long documentSequenceNumber) m_private->setDocumentSequenceNumber(documentSequenceNumber); } +WebSerializedScriptValue WebHistoryItem::stateObject() const +{ + return WebSerializedScriptValue(m_private->stateObject()); +} + +void WebHistoryItem::setStateObject(const WebSerializedScriptValue& object) +{ + ensureMutable(); + m_private->setStateObject(object); +} + WebString WebHistoryItem::httpContentType() const { - ASSERT(!isNull()); return m_private->formContentType(); } @@ -244,7 +247,6 @@ void WebHistoryItem::setHTTPContentType(const WebString& httpContentType) WebHTTPBody WebHistoryItem::httpBody() const { - ASSERT(!isNull()); return WebHTTPBody(m_private->formData()); } @@ -256,7 +258,6 @@ void WebHistoryItem::setHTTPBody(const WebHTTPBody& httpBody) WebVector<WebHistoryItem> WebHistoryItem::children() const { - ASSERT(!isNull()); return m_private->children(); } @@ -275,34 +276,25 @@ void WebHistoryItem::appendToChildren(const WebHistoryItem& item) } WebHistoryItem::WebHistoryItem(const PassRefPtr<HistoryItem>& item) - : m_private(static_cast<WebHistoryItemPrivate*>(item.releaseRef())) + : m_private(item) { } WebHistoryItem& WebHistoryItem::operator=(const PassRefPtr<HistoryItem>& item) { - assign(static_cast<WebHistoryItemPrivate*>(item.releaseRef())); + m_private = item; return *this; } WebHistoryItem::operator PassRefPtr<HistoryItem>() const { - return m_private; -} - -void WebHistoryItem::assign(WebHistoryItemPrivate* p) -{ - // p is already ref'd for us by the caller - if (m_private) - m_private->deref(); - m_private = p; + return m_private.get(); } void WebHistoryItem::ensureMutable() { - ASSERT(!isNull()); if (!m_private->hasOneRef()) - assign(static_cast<WebHistoryItemPrivate*>(m_private->copy().releaseRef())); + m_private = m_private->copy(); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebIDBCallbacksImpl.cpp b/WebKit/chromium/src/WebIDBCallbacksImpl.cpp new file mode 100644 index 0000000..14ed02e --- /dev/null +++ b/WebKit/chromium/src/WebIDBCallbacksImpl.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBCallbacksImpl.h" + +#include "IDBCallbacks.h" +#include "IDBCursorBackendProxy.h" +#include "IDBDatabaseError.h" +#include "IDBDatabaseProxy.h" +#include "IDBIndexBackendProxy.h" +#include "IDBKey.h" +#include "IDBObjectStoreProxy.h" +#include "IDBTransactionBackendProxy.h" +#include "WebIDBCallbacks.h" +#include "WebIDBDatabase.h" +#include "WebIDBDatabaseError.h" +#include "WebIDBIndex.h" +#include "WebIDBKey.h" +#include "WebIDBObjectStore.h" +#include "WebIDBTransaction.h" +#include "WebSerializedScriptValue.h" + +#if ENABLE(INDEXED_DATABASE) + +namespace WebCore { + +WebIDBCallbacksImpl::WebIDBCallbacksImpl(PassRefPtr<IDBCallbacks> callbacks) + : m_callbacks(callbacks) +{ +} + +WebIDBCallbacksImpl::~WebIDBCallbacksImpl() +{ +} + +void WebIDBCallbacksImpl::onError(const WebKit::WebIDBDatabaseError& error) +{ + m_callbacks->onError(error); +} + +void WebIDBCallbacksImpl::onSuccess() +{ + m_callbacks->onSuccess(); +} + +void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBCursor* cursor) +{ + m_callbacks->onSuccess(IDBCursorBackendProxy::create(cursor)); +} + +void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBDatabase* webKitInstance) +{ + m_callbacks->onSuccess(IDBDatabaseProxy::create(webKitInstance)); +} + +void WebIDBCallbacksImpl::onSuccess(const WebKit::WebIDBKey& key) +{ + m_callbacks->onSuccess(key); +} + +void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBIndex* webKitInstance) +{ + m_callbacks->onSuccess(IDBIndexBackendProxy::create(webKitInstance)); +} + +void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBObjectStore* webKitInstance) +{ + m_callbacks->onSuccess(IDBObjectStoreProxy::create(webKitInstance)); +} + +void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBTransaction* webKitInstance) +{ + m_callbacks->onSuccess(IDBTransactionBackendProxy::create(webKitInstance)); +} + +void WebIDBCallbacksImpl::onSuccess(const WebKit::WebSerializedScriptValue& serializedScriptValue) +{ + m_callbacks->onSuccess(serializedScriptValue); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBCallbacksImpl.h b/WebKit/chromium/src/WebIDBCallbacksImpl.h new file mode 100644 index 0000000..33a72f4 --- /dev/null +++ b/WebKit/chromium/src/WebIDBCallbacksImpl.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef WebIDBCallbacksImpl_h +#define WebIDBCallbacksImpl_h + +#include "WebIDBCallbacks.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +#if ENABLE(INDEXED_DATABASE) + +namespace WebCore { + +class IDBCallbacks; + +class WebIDBCallbacksImpl : public WebKit::WebIDBCallbacks { +public: + WebIDBCallbacksImpl(PassRefPtr<IDBCallbacks>); + virtual ~WebIDBCallbacksImpl(); + + virtual void onError(const WebKit::WebIDBDatabaseError&); + virtual void onSuccess(); // For "null". + virtual void onSuccess(WebKit::WebIDBCursor*); + virtual void onSuccess(WebKit::WebIDBDatabase*); + virtual void onSuccess(const WebKit::WebIDBKey&); + virtual void onSuccess(WebKit::WebIDBIndex*); + virtual void onSuccess(WebKit::WebIDBObjectStore*); + virtual void onSuccess(WebKit::WebIDBTransaction*); + virtual void onSuccess(const WebKit::WebSerializedScriptValue&); + +private: + RefPtr<IDBCallbacks> m_callbacks; +}; + +} // namespace WebCore + +#endif + +#endif // WebIDBCallbacksImpl_h diff --git a/WebKit/chromium/src/WebIDBCursorImpl.cpp b/WebKit/chromium/src/WebIDBCursorImpl.cpp new file mode 100644 index 0000000..eca5d42 --- /dev/null +++ b/WebKit/chromium/src/WebIDBCursorImpl.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBCursorImpl.h" + +#include "IDBAny.h" +#include "IDBCallbacksProxy.h" +#include "IDBCursorBackendInterface.h" +#include "IDBKey.h" +#include "WebIDBKey.h" + +using namespace WebCore; + +namespace WebKit { + +WebIDBCursorImpl::WebIDBCursorImpl(PassRefPtr<IDBCursorBackendInterface> idbCursorBackend) + : m_idbCursorBackend(idbCursorBackend) +{ +} + +WebIDBCursorImpl::~WebIDBCursorImpl() +{ +} + +unsigned short WebIDBCursorImpl::direction() const +{ + return m_idbCursorBackend->direction(); +} + +WebIDBKey WebIDBCursorImpl::key() const +{ + return WebIDBKey(m_idbCursorBackend->key()); +} + +void WebIDBCursorImpl::value(WebSerializedScriptValue& serializedScriptValue, WebIDBKey& idbKey) const +{ + // Verify we're starting off with blank slates. + ASSERT(serializedScriptValue.isNull()); + ASSERT(idbKey.type() == WebIDBKey::InvalidType); + + RefPtr<IDBAny> any = m_idbCursorBackend->value(); + if (any->type() == IDBAny::SerializedScriptValueType) + serializedScriptValue.assign(any->serializedScriptValue()); + else if (any->type() == IDBAny::IDBKeyType) + idbKey.assign(any->idbKey()); + else + ASSERT_NOT_REACHED(); +} + +void WebIDBCursorImpl::update(const WebSerializedScriptValue& value, WebIDBCallbacks* callbacks, WebExceptionCode& ec) +{ + m_idbCursorBackend->update(value, IDBCallbacksProxy::create(callbacks), ec); +} + +void WebIDBCursorImpl::continueFunction(const WebIDBKey& key, WebIDBCallbacks* callbacks, WebExceptionCode& ec) +{ + m_idbCursorBackend->continueFunction(key, IDBCallbacksProxy::create(callbacks), ec); +} + +void WebIDBCursorImpl::remove(WebIDBCallbacks* callbacks, WebExceptionCode& ec) +{ + m_idbCursorBackend->remove(IDBCallbacksProxy::create(callbacks), ec); +} + +} // namespace WebCore diff --git a/WebKit/chromium/src/WebIDBCursorImpl.h b/WebKit/chromium/src/WebIDBCursorImpl.h new file mode 100644 index 0000000..39fa44b --- /dev/null +++ b/WebKit/chromium/src/WebIDBCursorImpl.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef WebIDBCursorImpl_h +#define WebIDBCursorImpl_h + +#include "WebCommon.h" +#include "WebExceptionCode.h" +#include "WebIDBCursor.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { class IDBCursorBackendInterface; } + +namespace WebKit { + +// See comment in WebIndexedObjectStore for a high level overview these classes. +class WebIDBCursorImpl : public WebIDBCursor { +public: + WebIDBCursorImpl(WTF::PassRefPtr<WebCore::IDBCursorBackendInterface>); + virtual ~WebIDBCursorImpl(); + + virtual unsigned short direction() const; + virtual WebIDBKey key() const; + virtual void value(WebSerializedScriptValue&, WebIDBKey&) const; + virtual void update(const WebSerializedScriptValue&, WebIDBCallbacks*, WebExceptionCode&); + virtual void continueFunction(const WebIDBKey&, WebIDBCallbacks*, WebExceptionCode&); + virtual void remove(WebIDBCallbacks*, WebExceptionCode&); + + private: + WTF::RefPtr<WebCore::IDBCursorBackendInterface> m_idbCursorBackend; +}; + +} // namespace WebKit + +#endif // WebIDBCursorImpl_h diff --git a/WebKit/chromium/src/WebIDBDatabaseError.cpp b/WebKit/chromium/src/WebIDBDatabaseError.cpp new file mode 100644 index 0000000..cbbe14a --- /dev/null +++ b/WebKit/chromium/src/WebIDBDatabaseError.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebIDBDatabaseError.h" + +#include "IDBDatabaseError.h" +#include "WebString.h" + +#if ENABLE(INDEXED_DATABASE) + +using namespace WebCore; + +namespace WebKit { + +void WebIDBDatabaseError::assign(const WebIDBDatabaseError& value) +{ + m_private = value.m_private; +} + +void WebIDBDatabaseError::assign(unsigned short code, const WebString& message) +{ + m_private = IDBDatabaseError::create(code, message); +} + +void WebIDBDatabaseError::reset() +{ + m_private.reset(); +} + +unsigned short WebIDBDatabaseError::code() const +{ + return m_private->code(); +} + +WebString WebIDBDatabaseError::message() const +{ + return m_private->message(); +} + +WebIDBDatabaseError::WebIDBDatabaseError(const PassRefPtr<IDBDatabaseError>& value) + : m_private(value) +{ +} + +WebIDBDatabaseError& WebIDBDatabaseError::operator=(const PassRefPtr<IDBDatabaseError>& value) +{ + m_private = value; + return *this; +} + +WebIDBDatabaseError::operator PassRefPtr<IDBDatabaseError>() const +{ + return m_private.get(); +} + +} // namespace WebKit + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBDatabaseImpl.cpp b/WebKit/chromium/src/WebIDBDatabaseImpl.cpp new file mode 100644 index 0000000..fa7a200 --- /dev/null +++ b/WebKit/chromium/src/WebIDBDatabaseImpl.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBDatabaseImpl.h" + +#include "DOMStringList.h" +#include "IDBCallbacksProxy.h" +#include "IDBDatabaseBackendInterface.h" +#include "IDBTransactionBackendInterface.h" +#include "WebIDBCallbacks.h" +#include "WebIDBObjectStoreImpl.h" +#include "WebIDBTransactionImpl.h" + +#if ENABLE(INDEXED_DATABASE) + +using namespace WebCore; + +namespace WebKit { + +WebIDBDatabaseImpl::WebIDBDatabaseImpl(PassRefPtr<IDBDatabaseBackendInterface> databaseBackend) + : m_databaseBackend(databaseBackend) +{ +} + +WebIDBDatabaseImpl::~WebIDBDatabaseImpl() +{ +} + +WebString WebIDBDatabaseImpl::name() const +{ + return m_databaseBackend->name(); +} + +WebString WebIDBDatabaseImpl::version() const +{ + return m_databaseBackend->version(); +} + +WebDOMStringList WebIDBDatabaseImpl::objectStoreNames() const +{ + return m_databaseBackend->objectStoreNames(); +} + +WebIDBObjectStore* WebIDBDatabaseImpl::createObjectStore(const WebString& name, const WebString& keyPath, bool autoIncrement, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + RefPtr<IDBObjectStoreBackendInterface> objectStore = m_databaseBackend->createObjectStore(name, keyPath, autoIncrement, transaction.getIDBTransactionBackendInterface(), ec); + if (!objectStore) { + ASSERT(ec); + return 0; + } + return new WebIDBObjectStoreImpl(objectStore); +} + +void WebIDBDatabaseImpl::deleteObjectStore(const WebString& name, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_databaseBackend->deleteObjectStore(name, transaction.getIDBTransactionBackendInterface(), ec); +} + +void WebIDBDatabaseImpl::setVersion(const WebString& version, WebIDBCallbacks* callbacks, WebExceptionCode& ec) +{ + m_databaseBackend->setVersion(version, IDBCallbacksProxy::create(callbacks), ec); +} + +WebIDBTransaction* WebIDBDatabaseImpl::transaction(const WebDOMStringList& names, unsigned short mode, unsigned long timeout, WebExceptionCode& ec) +{ + RefPtr<DOMStringList> nameList = PassRefPtr<DOMStringList>(names); + RefPtr<IDBTransactionBackendInterface> transaction = m_databaseBackend->transaction(nameList.get(), mode, timeout, ec); + if (!transaction) { + ASSERT(ec); + return 0; + } + return new WebIDBTransactionImpl(transaction); +} + +void WebIDBDatabaseImpl::close() +{ + m_databaseBackend->close(); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBDatabaseImpl.h b/WebKit/chromium/src/WebIDBDatabaseImpl.h new file mode 100644 index 0000000..64e0b2e --- /dev/null +++ b/WebKit/chromium/src/WebIDBDatabaseImpl.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef WebIDBDatabaseImpl_h +#define WebIDBDatabaseImpl_h + +#include "WebCommon.h" +#include "WebExceptionCode.h" +#include "WebIDBDatabase.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { class IDBDatabaseBackendInterface; } + +namespace WebKit { + +class WebIDBObjectStore; +class WebIDBTransaction; + +// See comment in WebIDBFactory for a high level overview these classes. +class WebIDBDatabaseImpl : public WebIDBDatabase { +public: + WebIDBDatabaseImpl(WTF::PassRefPtr<WebCore::IDBDatabaseBackendInterface>); + virtual ~WebIDBDatabaseImpl(); + + virtual WebString name() const; + virtual WebString version() const; + virtual WebDOMStringList objectStoreNames() const; + + virtual WebIDBObjectStore* createObjectStore(const WebString& name, const WebString& keyPath, bool autoIncrement, const WebIDBTransaction&, WebExceptionCode&); + virtual void deleteObjectStore(const WebString& name, const WebIDBTransaction&, WebExceptionCode&); + virtual void setVersion(const WebString& version, WebIDBCallbacks* callbacks, WebExceptionCode&); + virtual WebIDBTransaction* transaction(const WebDOMStringList& names, unsigned short mode, unsigned long timeout, WebExceptionCode&); + virtual void close(); + +private: + WTF::RefPtr<WebCore::IDBDatabaseBackendInterface> m_databaseBackend; +}; + +} // namespace WebKit + +#endif // WebIDBDatabaseImpl_h diff --git a/WebKit/chromium/src/WebIDBFactoryImpl.cpp b/WebKit/chromium/src/WebIDBFactoryImpl.cpp new file mode 100755 index 0000000..a509076 --- /dev/null +++ b/WebKit/chromium/src/WebIDBFactoryImpl.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebIDBFactoryImpl.h" + +#include "DOMStringList.h" +#include "IDBCallbacksProxy.h" +#include "IDBFactoryBackendImpl.h" +#include "SecurityOrigin.h" +#include "WebIDBDatabaseError.h" +#include <wtf/OwnPtr.h> + +#if ENABLE(INDEXED_DATABASE) + +using namespace WebCore; + +namespace WebKit { + +WebIDBFactory* WebIDBFactory::create() +{ + return new WebIDBFactoryImpl(); +} + +WebIDBFactoryImpl::WebIDBFactoryImpl() + : m_idbFactoryBackend(WebCore::IDBFactoryBackendImpl::create()) +{ +} + +WebIDBFactoryImpl::~WebIDBFactoryImpl() +{ +} + +void WebIDBFactoryImpl::open(const WebString& name, WebIDBCallbacks* callbacks, const WebSecurityOrigin& origin, WebFrame*, const WebString& dataDir, unsigned long long maximumSize) +{ + m_idbFactoryBackend->open(name, IDBCallbacksProxy::create(callbacks), origin, 0, dataDir, maximumSize); +} + +} // namespace WebKit + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBFactoryImpl.h b/WebKit/chromium/src/WebIDBFactoryImpl.h new file mode 100755 index 0000000..9ed6e3f --- /dev/null +++ b/WebKit/chromium/src/WebIDBFactoryImpl.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2010 Google 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef WebIDBFactoryImpl_h +#define WebIDBFactoryImpl_h + +#include "WebDOMStringList.h" +#include "WebIDBFactory.h" +#include <wtf/RefPtr.h> + +namespace WebCore { class IDBFactoryBackendInterface; } + +namespace WebKit { + +class WebIDBFactoryImpl : public WebIDBFactory { +public: + WebIDBFactoryImpl(); + virtual ~WebIDBFactoryImpl(); + + virtual void open(const WebString& name, WebIDBCallbacks*, const WebSecurityOrigin&, WebFrame*, const WebString& dataDir, unsigned long long maximumSize); + +private: + WTF::RefPtr<WebCore::IDBFactoryBackendInterface> m_idbFactoryBackend; +}; + +} // namespace WebKit + +#endif // WebIDBFactoryImpl_h diff --git a/WebKit/chromium/src/WebIDBIndexImpl.cpp b/WebKit/chromium/src/WebIDBIndexImpl.cpp new file mode 100644 index 0000000..6e8e1f2 --- /dev/null +++ b/WebKit/chromium/src/WebIDBIndexImpl.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBIndexImpl.h" + +#include "IDBCallbacksProxy.h" +#include "IDBIndex.h" +#include "IDBKeyRange.h" +#include "WebIDBCallbacks.h" +#include "WebIDBKey.h" +#include "WebIDBKeyRange.h" + +#if ENABLE(INDEXED_DATABASE) + +using namespace WebCore; + +namespace WebKit { + +WebIDBIndexImpl::WebIDBIndexImpl(PassRefPtr<IDBIndexBackendInterface> backend) + : m_backend(backend) +{ +} + +WebIDBIndexImpl::~WebIDBIndexImpl() +{ +} + +WebString WebIDBIndexImpl::name() const +{ + return m_backend->name(); +} + +WebString WebIDBIndexImpl::storeName() const +{ + return m_backend->storeName(); +} + +WebString WebIDBIndexImpl::keyPath() const +{ + return m_backend->keyPath(); +} + +bool WebIDBIndexImpl::unique() const +{ + return m_backend->unique(); +} + +void WebIDBIndexImpl::openObjectCursor(const WebIDBKeyRange& keyRange, unsigned short direction, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_backend->openCursor(keyRange, direction, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec); +} + +void WebIDBIndexImpl::openKeyCursor(const WebIDBKeyRange& keyRange, unsigned short direction, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_backend->openKeyCursor(keyRange, direction, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec); +} + +void WebIDBIndexImpl::getObject(const WebIDBKey& keyRange, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_backend->get(keyRange, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec); +} + +void WebIDBIndexImpl::getKey(const WebIDBKey& keyRange, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_backend->getKey(keyRange, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBIndexImpl.h b/WebKit/chromium/src/WebIDBIndexImpl.h new file mode 100644 index 0000000..f68da7f --- /dev/null +++ b/WebKit/chromium/src/WebIDBIndexImpl.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef WebIDBIndexImpl_h +#define WebIDBIndexImpl_h + +#include "WebCommon.h" +#include "WebIDBIndex.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { class IDBIndexBackendInterface; } + +namespace WebKit { + +// See comment in WebIndexedDatabase for a high level overview these classes. +class WebIDBIndexImpl : public WebIDBIndex { +public: + WebIDBIndexImpl(WTF::PassRefPtr<WebCore::IDBIndexBackendInterface>); + virtual ~WebIDBIndexImpl(); + + virtual WebString name() const; + virtual WebString storeName() const; + virtual WebString keyPath() const; + virtual bool unique() const; + + virtual void openObjectCursor(const WebIDBKeyRange&, unsigned short direction, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&); + virtual void openKeyCursor(const WebIDBKeyRange&, unsigned short direction, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&); + virtual void getObject(const WebIDBKey&, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&); + virtual void getKey(const WebIDBKey&, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&); + +private: + WTF::RefPtr<WebCore::IDBIndexBackendInterface> m_backend; +}; + +} // namespace WebKit + +#endif // WebIDBIndexImpl_h diff --git a/WebKit/chromium/src/WebIDBKey.cpp b/WebKit/chromium/src/WebIDBKey.cpp new file mode 100644 index 0000000..b7a7db8 --- /dev/null +++ b/WebKit/chromium/src/WebIDBKey.cpp @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebIDBKey.h" + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBBindingUtilities.h" +#include "IDBKey.h" +#include "IDBKeyPath.h" +#include "SerializedScriptValue.h" +#include "WebIDBKeyPath.h" +#include "WebSerializedScriptValue.h" + +using namespace WebCore; + +namespace WebKit { + +WebIDBKey WebIDBKey::createNull() +{ + WebIDBKey key; + key.assignNull(); + return key; +} + +WebIDBKey WebIDBKey::createInvalid() +{ + WebIDBKey key; + key.assignInvalid(); + return key; +} + +WebIDBKey WebIDBKey::createFromValueAndKeyPath(const WebSerializedScriptValue& serializedScriptValue, const WebIDBKeyPath& idbKeyPath) +{ + if (serializedScriptValue.isNull()) + return WebIDBKey::createInvalid(); + return WebCore::createIDBKeyFromSerializedValueAndKeyPath(serializedScriptValue, idbKeyPath); +} + +void WebIDBKey::assign(const WebIDBKey& value) +{ + m_private = value.m_private; +} + +void WebIDBKey::assignNull() +{ + m_private = IDBKey::create(); +} + +void WebIDBKey::assign(const WebString& string) +{ + m_private = IDBKey::create(string); +} + +void WebIDBKey::assign(double number) +{ + m_private = IDBKey::create(number); +} + +void WebIDBKey::assignInvalid() +{ + m_private = 0; +} + +void WebIDBKey::reset() +{ + m_private.reset(); +} + +WebIDBKey::Type WebIDBKey::type() const +{ + if (!m_private.get()) + return InvalidType; + return Type(m_private->type()); +} + +WebString WebIDBKey::string() const +{ + return m_private->string(); +} + +double WebIDBKey::number() const +{ + return m_private->number(); +} + +WebIDBKey::WebIDBKey(const PassRefPtr<IDBKey>& value) + : m_private(value) +{ +} + +WebIDBKey& WebIDBKey::operator=(const PassRefPtr<IDBKey>& value) +{ + m_private = value; + return *this; +} + +WebIDBKey::operator PassRefPtr<IDBKey>() const +{ + return m_private.get(); +} + +} // namespace WebKit + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBKeyPath.cpp b/WebKit/chromium/src/WebIDBKeyPath.cpp new file mode 100644 index 0000000..9eb33d6 --- /dev/null +++ b/WebKit/chromium/src/WebIDBKeyPath.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBKeyPath.h" + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBKeyPath.h" +#include "WebString.h" +#include "WebVector.h" +#include <wtf/Vector.h> + +using namespace WebCore; + +namespace WebKit { + +WebIDBKeyPath WebIDBKeyPath::create(const WebString& keyPath) +{ + WTF::Vector<IDBKeyPathElement> idbElements; + IDBKeyPathParseError idbError; + IDBParseKeyPath(keyPath, idbElements, idbError); + return WebIDBKeyPath(idbElements, static_cast<int>(idbError)); +} + +WebIDBKeyPath::WebIDBKeyPath(const WTF::Vector<IDBKeyPathElement>& elements, int parseError) + : m_private(new WTF::Vector<IDBKeyPathElement>(elements)) + , m_parseError(parseError) +{ +} + +int WebIDBKeyPath::parseError() const +{ + return m_parseError; +} + +void WebIDBKeyPath::assign(const WebIDBKeyPath& keyPath) +{ + m_parseError = keyPath.m_parseError; + m_private.reset(new WTF::Vector<IDBKeyPathElement>(keyPath)); +} + +void WebIDBKeyPath::reset() +{ + m_private.reset(0); +} + +WebIDBKeyPath::operator const WTF::Vector<WebCore::IDBKeyPathElement, 0>&() const +{ + return *m_private.get(); +} + +} // namespace WebKit + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBKeyRange.cpp b/WebKit/chromium/src/WebIDBKeyRange.cpp new file mode 100644 index 0000000..ec5b7c2 --- /dev/null +++ b/WebKit/chromium/src/WebIDBKeyRange.cpp @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBKeyRange.h" + +#include "IDBKey.h" +#include "IDBKeyRange.h" +#include "WebIDBKey.h" + +using WebCore::IDBKeyRange; + +namespace WebKit { + +void WebIDBKeyRange::assign(const WebIDBKeyRange& other) +{ + m_private = other.m_private; +} + +void WebIDBKeyRange::assign(const WebIDBKey& lower, const WebIDBKey& upper, bool lowerOpen, bool upperOpen) +{ + if (lower.type() == WebIDBKey::InvalidType && upper.type() == WebIDBKey::InvalidType) + m_private = 0; + else + m_private = IDBKeyRange::create(lower, upper, lowerOpen, upperOpen); +} + +// FIXME: Remove this after next roll. +void WebIDBKeyRange::assign(const WebIDBKey& lower, const WebIDBKey& upper, unsigned short flags) +{ + bool lowerOpen = !!(flags & 1); + bool upperOpen = !!(flags & 2); + + if (lower.type() == WebIDBKey::InvalidType && upper.type() == WebIDBKey::InvalidType) + m_private = 0; + else + m_private = IDBKeyRange::create(lower, upper, lowerOpen, upperOpen); +} + +void WebIDBKeyRange::reset() +{ + m_private.reset(); +} + +WebIDBKey WebIDBKeyRange::left() const +{ + return lower(); +} + +WebIDBKey WebIDBKeyRange::right() const +{ + return upper(); +} + +WebIDBKey WebIDBKeyRange::lower() const +{ + if (!m_private.get()) + return WebIDBKey::createInvalid(); + return m_private->lower(); +} + +WebIDBKey WebIDBKeyRange::upper() const +{ + if (!m_private.get()) + return WebIDBKey::createInvalid(); + return m_private->upper(); +} + +bool WebIDBKeyRange::lowerOpen() const +{ + return m_private.get() && m_private->lowerOpen(); +} + +bool WebIDBKeyRange::upperOpen() const +{ + return m_private.get() && m_private->upperOpen(); +} + +// FIXME: Remove this after next roll. +unsigned short WebIDBKeyRange::flags() const +{ + if (!m_private.get()) + return 0; + + unsigned short flags = 0; + if (m_private->lowerOpen()) + flags |= 1; + if (m_private->upperOpen()) + flags |= 2; + return flags; +} + +WebIDBKeyRange::WebIDBKeyRange(const PassRefPtr<IDBKeyRange>& value) + : m_private(value) +{ +} + +WebIDBKeyRange& WebIDBKeyRange::operator=(const PassRefPtr<IDBKeyRange>& value) +{ + m_private = value; + return *this; +} + +WebIDBKeyRange::operator PassRefPtr<IDBKeyRange>() const +{ + return m_private.get(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp b/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp new file mode 100755 index 0000000..0503ede --- /dev/null +++ b/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBObjectStoreImpl.h" + +#include "DOMStringList.h" +#include "IDBCallbacksProxy.h" +#include "IDBKeyRange.h" +#include "IDBObjectStoreBackendInterface.h" +#include "WebIDBIndexImpl.h" +#include "WebIDBKey.h" +#include "WebIDBKeyRange.h" +#include "WebIDBTransaction.h" +#include "WebSerializedScriptValue.h" + +#if ENABLE(INDEXED_DATABASE) + +using namespace WebCore; + +namespace WebKit { + +WebIDBObjectStoreImpl::WebIDBObjectStoreImpl(PassRefPtr<IDBObjectStoreBackendInterface> objectStore) + : m_objectStore(objectStore) +{ +} + +WebIDBObjectStoreImpl::~WebIDBObjectStoreImpl() +{ +} + +WebString WebIDBObjectStoreImpl::name() const +{ + return m_objectStore->name(); +} + +WebString WebIDBObjectStoreImpl::keyPath() const +{ + return m_objectStore->keyPath(); +} + +WebDOMStringList WebIDBObjectStoreImpl::indexNames() const +{ + return m_objectStore->indexNames(); +} + +void WebIDBObjectStoreImpl::get(const WebIDBKey& key, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_objectStore->get(key, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec); +} + +void WebIDBObjectStoreImpl::put(const WebSerializedScriptValue& value, const WebIDBKey& key, bool addOnly, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_objectStore->put(value, key, addOnly, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec); +} + +void WebIDBObjectStoreImpl::deleteFunction(const WebIDBKey& key, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_objectStore->deleteFunction(key, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec); +} + +WebIDBIndex* WebIDBObjectStoreImpl::createIndex(const WebString& name, const WebString& keyPath, bool unique, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + RefPtr<IDBIndexBackendInterface> index = m_objectStore->createIndex(name, keyPath, unique, transaction.getIDBTransactionBackendInterface(), ec); + if (!index) + return 0; + return new WebIDBIndexImpl(index); +} + +WebIDBIndex* WebIDBObjectStoreImpl::index(const WebString& name, WebExceptionCode& ec) +{ + RefPtr<IDBIndexBackendInterface> index = m_objectStore->index(name, ec); + if (!index) + return 0; + return new WebIDBIndexImpl(index); +} + +void WebIDBObjectStoreImpl::deleteIndex(const WebString& name, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_objectStore->deleteIndex(name, transaction.getIDBTransactionBackendInterface(), ec); +} + +void WebIDBObjectStoreImpl::openCursor(const WebIDBKeyRange& keyRange, unsigned short direction, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec) +{ + m_objectStore->openCursor(keyRange, direction, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBObjectStoreImpl.h b/WebKit/chromium/src/WebIDBObjectStoreImpl.h new file mode 100755 index 0000000..f9cd776 --- /dev/null +++ b/WebKit/chromium/src/WebIDBObjectStoreImpl.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef WebIDBObjectStoreImpl_h +#define WebIDBObjectStoreImpl_h + +#include "WebCommon.h" +#include "WebIDBObjectStore.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { class IDBObjectStoreBackendInterface; } + +namespace WebKit { + +class WebIDBIndex; + +// See comment in WebIndexedObjectStore for a high level overview these classes. +class WebIDBObjectStoreImpl : public WebIDBObjectStore { +public: + WebIDBObjectStoreImpl(WTF::PassRefPtr<WebCore::IDBObjectStoreBackendInterface>); + ~WebIDBObjectStoreImpl(); + + WebString name() const; + WebString keyPath() const; + WebDOMStringList indexNames() const; + + void get(const WebIDBKey& key, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&); + void put(const WebSerializedScriptValue&, const WebIDBKey& key, bool addOnly, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&); + void deleteFunction(const WebIDBKey& key, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&); + + WebIDBIndex* createIndex(const WebString& name, const WebString& keyPath, bool unique, const WebIDBTransaction&, WebExceptionCode&); + WebIDBIndex* index(const WebString& name, WebExceptionCode&); + void deleteIndex(const WebString& name, const WebIDBTransaction&, WebExceptionCode&); + + void openCursor(const WebIDBKeyRange&, unsigned short direction, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&); + + private: + WTF::RefPtr<WebCore::IDBObjectStoreBackendInterface> m_objectStore; +}; + +} // namespace WebKit + +#endif // WebIDBObjectStoreImpl_h diff --git a/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.cpp b/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.cpp new file mode 100644 index 0000000..96924cf --- /dev/null +++ b/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBTransactionCallbacksImpl.h" + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBTransactionCallbacks.h" + +namespace WebCore { + +WebIDBTransactionCallbacksImpl::WebIDBTransactionCallbacksImpl(PassRefPtr<IDBTransactionCallbacks> callbacks) + : m_callbacks(callbacks) +{ +} + +WebIDBTransactionCallbacksImpl::~WebIDBTransactionCallbacksImpl() +{ +} + +void WebIDBTransactionCallbacksImpl::onAbort() +{ + m_callbacks->onAbort(); +} + +void WebIDBTransactionCallbacksImpl::onComplete() +{ + m_callbacks->onComplete(); +} + +void WebIDBTransactionCallbacksImpl::onTimeout() +{ + m_callbacks->onTimeout(); +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.h b/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.h new file mode 100644 index 0000000..89b9cbe --- /dev/null +++ b/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef WebIDBTransactionCallbacksImpl_h +#define WebIDBTransactionCallbacksImpl_h + +#if ENABLE(INDEXED_DATABASE) + +#include "WebIDBTransactionCallbacks.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { + +class IDBTransactionCallbacks; + +class WebIDBTransactionCallbacksImpl : public WebKit::WebIDBTransactionCallbacks { +public: + WebIDBTransactionCallbacksImpl(PassRefPtr<IDBTransactionCallbacks>); + virtual ~WebIDBTransactionCallbacksImpl(); + + virtual void onAbort(); + virtual void onComplete(); + virtual void onTimeout(); + +private: + RefPtr<IDBTransactionCallbacks> m_callbacks; +}; + +} // namespace WebCore + +#endif + +#endif // WebIDBTransactionCallbacksImpl_h diff --git a/WebKit/chromium/src/WebIDBTransactionImpl.cpp b/WebKit/chromium/src/WebIDBTransactionImpl.cpp new file mode 100644 index 0000000..1ed6f4b --- /dev/null +++ b/WebKit/chromium/src/WebIDBTransactionImpl.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebIDBTransactionImpl.h" + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBTransaction.h" +#include "IDBTransactionCallbacksProxy.h" +#include "WebIDBObjectStoreImpl.h" +#include "WebIDBTransactionCallbacks.h" + +using namespace WebCore; + +namespace WebKit { + +WebIDBTransactionImpl::WebIDBTransactionImpl(PassRefPtr<IDBTransactionBackendInterface> backend) + : m_backend(backend) +{ +} + +WebIDBTransactionImpl::~WebIDBTransactionImpl() +{ +} + +int WebIDBTransactionImpl::mode() const +{ + return m_backend->mode(); +} + +WebIDBObjectStore* WebIDBTransactionImpl::objectStore(const WebString& name, ExceptionCode& ec) +{ + RefPtr<IDBObjectStoreBackendInterface> objectStore = m_backend->objectStore(name, ec); + if (!objectStore) + return 0; + return new WebIDBObjectStoreImpl(objectStore); +} + +void WebIDBTransactionImpl::abort() +{ + m_backend->abort(); +} + +void WebIDBTransactionImpl::didCompleteTaskEvents() +{ + m_backend->didCompleteTaskEvents(); +} + +void WebIDBTransactionImpl::setCallbacks(WebIDBTransactionCallbacks* callbacks) +{ + RefPtr<IDBTransactionCallbacks> idbCallbacks = IDBTransactionCallbacksProxy::create(callbacks); + m_backend->setCallbacks(idbCallbacks.get()); +} + +IDBTransactionBackendInterface* WebIDBTransactionImpl::getIDBTransactionBackendInterface() const +{ + return m_backend.get(); +} + +} // namespace WebKit + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/WebKit/chromium/src/WebIDBTransactionImpl.h b/WebKit/chromium/src/WebIDBTransactionImpl.h new file mode 100644 index 0000000..d26fc37 --- /dev/null +++ b/WebKit/chromium/src/WebIDBTransactionImpl.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#ifndef WebIDBTransactionImpl_h +#define WebIDBTransactionImpl_h + +#if ENABLE(INDEXED_DATABASE) + +#include "WebCommon.h" +#include "WebIDBTransaction.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebKit { + +// See comment in WebIndexedDatabase for a high level overview these classes. +class WebIDBTransactionImpl: public WebIDBTransaction { +public: + WebIDBTransactionImpl(WTF::PassRefPtr<WebCore::IDBTransactionBackendInterface>); + virtual ~WebIDBTransactionImpl(); + + virtual int mode() const; + virtual WebIDBObjectStore* objectStore(const WebString& name, WebExceptionCode&); + virtual void abort(); + virtual void didCompleteTaskEvents(); + virtual void setCallbacks(WebIDBTransactionCallbacks*); + + virtual WebCore::IDBTransactionBackendInterface* getIDBTransactionBackendInterface() const; + +private: + WTF::RefPtr<WebCore::IDBTransactionBackendInterface> m_backend; +}; + +} // namespace WebKit + +#endif // ENABLE(INDEXED_DATABASE) + +#endif // WebIDBTransactionImpl_h diff --git a/WebKit/chromium/src/WebImageCG.cpp b/WebKit/chromium/src/WebImageCG.cpp index 60b2449..045c8be 100644 --- a/WebKit/chromium/src/WebImageCG.cpp +++ b/WebKit/chromium/src/WebImageCG.cpp @@ -89,14 +89,16 @@ WebSize WebImage::size() const WebImage::WebImage(const PassRefPtr<Image>& image) : m_imageRef(0) { - if (image.get()) - assign(image->nativeImageForCurrentFrame()); + NativeImagePtr p; + if (image.get() && (p = image->nativeImageForCurrentFrame())) + assign(p); } WebImage& WebImage::operator=(const PassRefPtr<Image>& image) { - if (image.get()) - assign(image->nativeImageForCurrentFrame()); + NativeImagePtr p; + if (image.get() && (p = image->nativeImageForCurrentFrame())) + assign(p); else reset(); return *this; diff --git a/WebKit/chromium/src/WebImageDecoder.cpp b/WebKit/chromium/src/WebImageDecoder.cpp new file mode 100644 index 0000000..0cfd458 --- /dev/null +++ b/WebKit/chromium/src/WebImageDecoder.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebImageDecoder.h" + +#include "BMPImageDecoder.h" +#include "ICOImageDecoder.h" +#include "SharedBuffer.h" +#include "WebData.h" +#include "WebImage.h" +#include "WebSize.h" + +#if WEBKIT_USING_SKIA +#include <wtf/OwnPtr.h> +#include <wtf/PassRefPtr.h> +#endif + +using namespace WebCore; + +namespace WebKit { + +void WebImageDecoder::reset() +{ + delete m_private; +} + +void WebImageDecoder::init(Type type) +{ + switch (type) { + case TypeBMP: + m_private = new BMPImageDecoder(true, false); + break; + case TypeICO: + m_private = new ICOImageDecoder(true, false); + break; + } +} + +void WebImageDecoder::setData(const WebData& data, bool allDataReceived) +{ + ASSERT(m_private); + m_private->setData(PassRefPtr<SharedBuffer>(data).get(), allDataReceived); +} + +bool WebImageDecoder::isFailed() const +{ + ASSERT(m_private); + return m_private->failed(); +} + +bool WebImageDecoder::isSizeAvailable() const +{ + ASSERT(m_private); + return m_private->isSizeAvailable(); +} + +WebSize WebImageDecoder::size() const +{ + ASSERT(m_private); + return m_private->size(); +} + +size_t WebImageDecoder::frameCount() const +{ + ASSERT(m_private); + return m_private->frameCount(); +} + +bool WebImageDecoder::isFrameCompleteAtIndex(int index) const +{ + ASSERT(m_private); + RGBA32Buffer* const frameBuffer = m_private->frameBufferAtIndex(index); + if (!frameBuffer) + return false; + return (frameBuffer->status() == RGBA32Buffer::FrameComplete); +} + +WebImage WebImageDecoder::getFrameAtIndex(int index = 0) const +{ + ASSERT(m_private); + RGBA32Buffer* const frameBuffer = m_private->frameBufferAtIndex(index); + if (!frameBuffer) + return WebImage(); +#if WEBKIT_USING_SKIA + OwnPtr<NativeImageSkia>image(frameBuffer->asNewNativeImage()); + return WebImage(*image); +#elif WEBKIT_USING_CG + // FIXME: Implement CG side of this. + return WebImage(frameBuffer->asNewNativeImage()); +#endif +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebInputElement.cpp b/WebKit/chromium/src/WebInputElement.cpp index 9fd317f..8d89c60 100644 --- a/WebKit/chromium/src/WebInputElement.cpp +++ b/WebKit/chromium/src/WebInputElement.cpp @@ -40,20 +40,24 @@ using namespace WebCore; namespace WebKit { -WebInputElement::WebInputElement(const WTF::PassRefPtr<HTMLInputElement>& elem) - : WebElement(elem.releaseRef()) +bool WebInputElement::isTextField() const { + return constUnwrap<HTMLInputElement>()->isTextField(); } -WebInputElement& WebInputElement::operator=(const WTF::PassRefPtr<HTMLInputElement>& elem) +bool WebInputElement::isText() const { - WebNode::assign(elem.releaseRef()); - return *this; + return constUnwrap<HTMLInputElement>()->isText(); +} + +bool WebInputElement::isPasswordField() const +{ + return constUnwrap<HTMLInputElement>()->isPasswordField(); } -WebInputElement::operator WTF::PassRefPtr<HTMLInputElement>() const +bool WebInputElement::isImageButton() const { - return PassRefPtr<HTMLInputElement>(static_cast<HTMLInputElement*>(m_private)); + return constUnwrap<HTMLInputElement>()->isImageButton(); } bool WebInputElement::autoComplete() const @@ -61,19 +65,19 @@ bool WebInputElement::autoComplete() const return constUnwrap<HTMLInputElement>()->autoComplete(); } -bool WebInputElement::isEnabledFormControl() const +bool WebInputElement::isReadOnly() const { - return constUnwrap<HTMLInputElement>()->isEnabledFormControl(); + return constUnwrap<HTMLInputElement>()->readOnly(); } -WebInputElement::InputType WebInputElement::inputType() const +bool WebInputElement::isEnabledFormControl() const { - return static_cast<InputType>(constUnwrap<HTMLInputElement>()->inputType()); + return constUnwrap<HTMLInputElement>()->isEnabledFormControl(); } -WebString WebInputElement::formControlType() const +int WebInputElement::maxLength() const { - return constUnwrap<HTMLInputElement>()->formControlType(); + return constUnwrap<HTMLInputElement>()->maxLength(); } bool WebInputElement::isActivatedSubmit() const @@ -86,9 +90,14 @@ void WebInputElement::setActivatedSubmit(bool activated) unwrap<HTMLInputElement>()->setActivatedSubmit(activated); } -void WebInputElement::setValue(const WebString& value) +int WebInputElement::size() const +{ + return constUnwrap<HTMLInputElement>()->size(); +} + +void WebInputElement::setValue(const WebString& value, bool sendChangeEvent) { - unwrap<HTMLInputElement>()->setValue(value); + unwrap<HTMLInputElement>()->setValue(value, sendChangeEvent); } WebString WebInputElement::value() const @@ -96,6 +105,31 @@ WebString WebInputElement::value() const return constUnwrap<HTMLInputElement>()->value(); } +void WebInputElement::setSuggestedValue(const WebString& value) +{ + unwrap<HTMLInputElement>()->setSuggestedValue(value); +} + +WebString WebInputElement::suggestedValue() const +{ + return constUnwrap<HTMLInputElement>()->suggestedValue(); +} + +void WebInputElement::setPlaceholder(const WebString& value) +{ + unwrap<HTMLInputElement>()->setPlaceholder(value); +} + +WebString WebInputElement::placeholder() const +{ + return constUnwrap<HTMLInputElement>()->placeholder(); +} + +bool WebInputElement::isAutofilled() const +{ + return constUnwrap<HTMLInputElement>()->isAutofilled(); +} + void WebInputElement::setAutofilled(bool autoFilled) { unwrap<HTMLInputElement>()->setAutofilled(autoFilled); @@ -110,23 +144,38 @@ void WebInputElement::setSelectionRange(int start, int end) { unwrap<HTMLInputElement>()->setSelectionRange(start, end); } - -WebString WebInputElement::name() const + +int WebInputElement::selectionStart() const { - return constUnwrap<HTMLInputElement>()->name(); + return constUnwrap<HTMLInputElement>()->selectionStart(); } - -WebString WebInputElement::nameForAutofill() const + +int WebInputElement::selectionEnd() const +{ + return constUnwrap<HTMLInputElement>()->selectionEnd(); +} + +bool WebInputElement::isValidValue(const WebString& value) const +{ + return constUnwrap<HTMLInputElement>()->isValidValue(value); +} + +const int WebInputElement::defaultMaxLength = HTMLInputElement::s_maximumLength; + +WebInputElement::WebInputElement(const PassRefPtr<HTMLInputElement>& elem) + : WebFormControlElement(elem) +{ +} + +WebInputElement& WebInputElement::operator=(const PassRefPtr<HTMLInputElement>& elem) +{ + m_private = elem; + return *this; +} + +WebInputElement::operator PassRefPtr<HTMLInputElement>() const { - String name = constUnwrap<HTMLInputElement>()->name(); - String trimmedName = name.stripWhiteSpace(); - if (!trimmedName.isEmpty()) - return trimmedName; - name = constUnwrap<HTMLInputElement>()->getAttribute(HTMLNames::idAttr); - trimmedName = name.stripWhiteSpace(); - if (!trimmedName.isEmpty()) - return trimmedName; - return String(); + return static_cast<HTMLInputElement*>(m_private.get()); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebInputEvent.cpp b/WebKit/chromium/src/WebInputEvent.cpp index b5c56fa..c00200e 100644 --- a/WebKit/chromium/src/WebInputEvent.cpp +++ b/WebKit/chromium/src/WebInputEvent.cpp @@ -86,6 +86,8 @@ static const char* staticKeyIdentifiers(unsigned short keyCode) case VKEY_F9: return "F9"; case VKEY_F10: + return "F10"; + case VKEY_F11: return "F11"; case VKEY_F12: return "F12"; diff --git a/WebKit/chromium/src/WebInputEventConversion.cpp b/WebKit/chromium/src/WebInputEventConversion.cpp index 147f88b..24eb372 100644 --- a/WebKit/chromium/src/WebInputEventConversion.cpp +++ b/WebKit/chromium/src/WebInputEventConversion.cpp @@ -40,6 +40,7 @@ #include "PlatformWheelEvent.h" #include "ScrollView.h" #include "WebInputEvent.h" +#include "WheelEvent.h" #include "Widget.h" using namespace WebCore; @@ -103,7 +104,7 @@ PlatformWheelEventBuilder::PlatformWheelEventBuilder(Widget* widget, const WebMo // MakePlatformKeyboardEvent -------------------------------------------------- -static inline const PlatformKeyboardEvent::Type toPlatformKeyboardEventType(WebInputEvent::Type type) +static inline PlatformKeyboardEvent::Type toPlatformKeyboardEventType(WebInputEvent::Type type) { switch (type) { case WebInputEvent::KeyUp: @@ -168,6 +169,64 @@ bool PlatformKeyboardEventBuilder::isCharacterKey() const return true; } +#if ENABLE(TOUCH_EVENTS) +static inline TouchEventType toPlatformTouchEventType(const WebInputEvent::Type type) +{ + switch (type) { + case WebInputEvent::TouchStart: + return TouchStart; + case WebInputEvent::TouchMove: + return TouchMove; + case WebInputEvent::TouchEnd: + return TouchEnd; + case WebInputEvent::TouchCancel: + return TouchCancel; + default: + ASSERT_NOT_REACHED(); + } + return TouchStart; +} + +static inline PlatformTouchPoint::State toPlatformTouchPointState(const WebTouchPoint::State state) +{ + switch (state) { + case WebTouchPoint::StateReleased: + return PlatformTouchPoint::TouchReleased; + case WebTouchPoint::StatePressed: + return PlatformTouchPoint::TouchPressed; + case WebTouchPoint::StateMoved: + return PlatformTouchPoint::TouchMoved; + case WebTouchPoint::StateStationary: + return PlatformTouchPoint::TouchStationary; + case WebTouchPoint::StateCancelled: + return PlatformTouchPoint::TouchCancelled; + case WebTouchPoint::StateUndefined: + ASSERT_NOT_REACHED(); + } + return PlatformTouchPoint::TouchReleased; +} + +PlatformTouchPointBuilder::PlatformTouchPointBuilder(Widget* widget, const WebTouchPoint& point) +{ + m_id = point.id; + m_state = toPlatformTouchPointState(point.state); + m_pos = widget->convertFromContainingWindow(point.position); + m_screenPos = point.screenPosition; +} + +PlatformTouchEventBuilder::PlatformTouchEventBuilder(Widget* widget, const WebTouchEvent& event) +{ + m_type = toPlatformTouchEventType(event.type); + m_ctrlKey = event.modifiers & WebInputEvent::ControlKey; + m_altKey = event.modifiers & WebInputEvent::AltKey; + m_shiftKey = event.modifiers & WebInputEvent::ShiftKey; + m_metaKey = event.modifiers & WebInputEvent::MetaKey; + + for (int i = 0; i < event.touchPointsLength; ++i) + m_touchPoints.append(PlatformTouchPointBuilder(widget, event.touchPoints[i])); +} +#endif + static int getWebInputModifiers(const UIEventWithKeyState& event) { int modifiers = 0; @@ -182,7 +241,7 @@ static int getWebInputModifiers(const UIEventWithKeyState& event) return modifiers; } -WebMouseEventBuilder::WebMouseEventBuilder(const ScrollView* view, const MouseEvent& event) +WebMouseEventBuilder::WebMouseEventBuilder(const Widget* widget, const MouseEvent& event) { if (event.type() == eventNames().mousemoveEvent) type = WebInputEvent::MouseMove; @@ -194,6 +253,8 @@ WebMouseEventBuilder::WebMouseEventBuilder(const ScrollView* view, const MouseEv type = WebInputEvent::MouseDown; else if (event.type() == eventNames().mouseupEvent) type = WebInputEvent::MouseUp; + else if (event.type() == eventNames().contextmenuEvent) + type = WebInputEvent::ContextMenu; else return; // Skip all other mouse events. timeStampSeconds = event.timeStamp() * 1.0e-3; @@ -222,16 +283,42 @@ WebMouseEventBuilder::WebMouseEventBuilder(const ScrollView* view, const MouseEv break; } } - IntPoint p = view->contentsToWindow(IntPoint(event.pageX(), event.pageY())); + ScrollView* view = widget->parent(); + IntPoint p = view->contentsToWindow( + IntPoint(event.absoluteLocation().x(), event.absoluteLocation().y())); globalX = event.screenX(); globalY = event.screenY(); windowX = p.x(); windowY = p.y(); - x = event.offsetX(); - y = event.offsetY(); + x = event.absoluteLocation().x() - widget->pos().x(); + y = event.absoluteLocation().y() - widget->pos().y(); clickCount = event.detail(); } +WebMouseWheelEventBuilder::WebMouseWheelEventBuilder(const Widget* widget, const WheelEvent& event) +{ + if (event.type() != eventNames().mousewheelEvent) + return; + type = WebInputEvent::MouseWheel; + timeStampSeconds = event.timeStamp() * 1.0e-3; + modifiers = getWebInputModifiers(event); + ScrollView* view = widget->parent(); + IntPoint p = view->contentsToWindow( + IntPoint(event.absoluteLocation().x(), event.absoluteLocation().y())); + globalX = event.screenX(); + globalY = event.screenY(); + windowX = p.x(); + windowY = p.y(); + x = event.absoluteLocation().x() - widget->pos().x(); + y = event.absoluteLocation().y() - widget->pos().y(); + deltaX = static_cast<float>(event.rawDeltaX()); + deltaY = static_cast<float>(event.rawDeltaY()); + // The 120 is from WheelEvent::initWheelEvent(). + wheelTicksX = static_cast<float>(event.wheelDeltaX()) / 120; + wheelTicksY = static_cast<float>(event.wheelDeltaY()) / 120; + scrollByPage = event.granularity() == WheelEvent::Page; +} + WebKeyboardEventBuilder::WebKeyboardEventBuilder(const KeyboardEvent& event) { if (event.type() == eventNames().keydownEvent) @@ -245,6 +332,11 @@ WebKeyboardEventBuilder::WebKeyboardEventBuilder(const KeyboardEvent& event) modifiers = getWebInputModifiers(event); timeStampSeconds = event.timeStamp() * 1.0e-3; windowsKeyCode = event.keyCode(); + + // The platform keyevent does not exist if the event was created using + // initKeyboardEvent. + if (!event.keyEvent()) + return; nativeKeyCode = event.keyEvent()->nativeVirtualKeyCode(); unsigned int numChars = std::min(event.keyEvent()->text().length(), static_cast<unsigned int>(WebKeyboardEvent::textLengthCap)); diff --git a/WebKit/chromium/src/WebInputEventConversion.h b/WebKit/chromium/src/WebInputEventConversion.h index 4c9cf82..63991a9 100644 --- a/WebKit/chromium/src/WebInputEventConversion.h +++ b/WebKit/chromium/src/WebInputEventConversion.h @@ -31,18 +31,18 @@ #ifndef WebInputEventConversion_h #define WebInputEventConversion_h -// FIXME: This relative path is a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebInputEvent.h" +#include "WebInputEvent.h" #include "PlatformKeyboardEvent.h" #include "PlatformMouseEvent.h" +#include "PlatformTouchEvent.h" #include "PlatformWheelEvent.h" namespace WebCore { class KeyboardEvent; class MouseEvent; class ScrollView; +class WheelEvent; class Widget; } @@ -72,20 +72,38 @@ public: bool isCharacterKey() const; }; +#if ENABLE(TOUCH_EVENTS) +class PlatformTouchPointBuilder : public WebCore::PlatformTouchPoint { +public: + PlatformTouchPointBuilder(WebCore::Widget*, const WebTouchPoint&); +}; + +class PlatformTouchEventBuilder : public WebCore::PlatformTouchEvent { +public: + PlatformTouchEventBuilder(WebCore::Widget*, const WebTouchEvent&); +}; +#endif + // Converts a WebCore::MouseEvent to a corresponding WebMouseEvent. view is -// the ScrollView corresponding to the event. Returns true if successful. +// the ScrollView corresponding to the event. // NOTE: This is only implemented for mousemove, mouseover, mouseout, // mousedown and mouseup. If the event mapping fails, the event type will // be set to Undefined. class WebMouseEventBuilder : public WebMouseEvent { public: - WebMouseEventBuilder(const WebCore::ScrollView*, const WebCore::MouseEvent&); + WebMouseEventBuilder(const WebCore::Widget*, const WebCore::MouseEvent&); +}; + +// Converts a WebCore::WheelEvent to a corresponding WebMouseWheelEvent. +// If the event mapping fails, the event type will be set to Undefined. +class WebMouseWheelEventBuilder : public WebMouseWheelEvent { +public: + WebMouseWheelEventBuilder(const WebCore::Widget*, const WebCore::WheelEvent&); }; // Converts a WebCore::KeyboardEvent to a corresponding WebKeyboardEvent. -// Returns true if successful. NOTE: This is only implemented for keydown -// and keyup. If the event mapping fails, the event type will be set to -// Undefined. +// NOTE: This is only implemented for keydown and keyup. If the event mapping +// fails, the event type will be set to Undefined. class WebKeyboardEventBuilder : public WebKeyboardEvent { public: WebKeyboardEventBuilder(const WebCore::KeyboardEvent&); diff --git a/WebKit/chromium/src/WebKit.cpp b/WebKit/chromium/src/WebKit.cpp index a8e1851..cadcb6c 100644 --- a/WebKit/chromium/src/WebKit.cpp +++ b/WebKit/chromium/src/WebKit.cpp @@ -31,7 +31,6 @@ #include "config.h" #include "WebKit.h" -#include "AtomicString.h" #include "DOMTimer.h" #include "Logging.h" #include "Page.h" @@ -43,20 +42,29 @@ #include <wtf/Assertions.h> #include <wtf/Threading.h> +#include <wtf/text/AtomicString.h> namespace WebKit { +// Make sure we are not re-initialized in the same address space. +// Doing so may cause hard to reproduce crashes. +static bool s_webKitInitialized = false; + static WebKitClient* s_webKitClient = 0; static bool s_layoutTestMode = false; void initialize(WebKitClient* webKitClient) { + ASSERT(!s_webKitInitialized); + s_webKitInitialized = true; + ASSERT(webKitClient); ASSERT(!s_webKitClient); s_webKitClient = webKitClient; WTF::initializeThreading(); - WebCore::AtomicString::init(); + WTF::initializeMainThread(); + WTF::AtomicString::init(); // Chromium sets the minimum interval timeout to 4ms, overriding the // default of 10ms. We'd like to go lower, however there are poorly diff --git a/WebKit/chromium/src/WebLabelElement.cpp b/WebKit/chromium/src/WebLabelElement.cpp new file mode 100644 index 0000000..ef2c698 --- /dev/null +++ b/WebKit/chromium/src/WebLabelElement.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebLabelElement.h" + +#include "HTMLLabelElement.h" +#include "HTMLNames.h" +#include "WebString.h" +#include <wtf/PassRefPtr.h> + +using namespace WebCore; + +namespace WebKit { + +WebElement WebLabelElement::correspondingControl() +{ + return WebElement(unwrap<HTMLLabelElement>()->control()); +} + +WebLabelElement::WebLabelElement(const PassRefPtr<HTMLLabelElement>& elem) + : WebElement(elem) +{ +} + +WebLabelElement& WebLabelElement::operator=(const PassRefPtr<HTMLLabelElement>& elem) +{ + m_private = elem; + return *this; +} + +WebLabelElement::operator PassRefPtr<HTMLLabelElement>() const +{ + return static_cast<HTMLLabelElement*>(m_private.get()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebMediaElement.cpp b/WebKit/chromium/src/WebMediaElement.cpp new file mode 100644 index 0000000..4adda1e --- /dev/null +++ b/WebKit/chromium/src/WebMediaElement.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebMediaElement.h" + +#include "HTMLMediaElement.h" +#include "MediaPlayer.h" +#include "WebMediaPlayer.h" +#include "WebMediaPlayerClientImpl.h" +#include <wtf/PassRefPtr.h> + +using namespace WebCore; + +namespace WebKit { + +WebMediaPlayer* WebMediaElement::player() const +{ + return WebMediaPlayerClientImpl::fromMediaElement(this)->mediaPlayer(); +} + +WebMediaElement::WebMediaElement(const PassRefPtr<HTMLMediaElement>& elem) + : WebElement(elem) +{ +} + +WebMediaElement& WebMediaElement::operator=(const PassRefPtr<HTMLMediaElement>& elem) +{ + m_private = elem; + return *this; +} + +WebMediaElement::operator PassRefPtr<HTMLMediaElement>() const +{ + return static_cast<HTMLMediaElement*>(m_private.get()); +} +} // namespace WebKit diff --git a/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp b/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp index b1f1f03..65f0fde 100644 --- a/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp +++ b/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp @@ -7,7 +7,6 @@ #if ENABLE(VIDEO) -#include "CString.h" #include "Frame.h" #include "GraphicsContext.h" #include "HTMLMediaElement.h" @@ -15,20 +14,30 @@ #include "KURL.h" #include "MediaPlayer.h" #include "NotImplemented.h" +#include "RenderView.h" #include "TimeRanges.h" +#include "VideoLayerChromium.h" +#if USE(ACCELERATED_COMPOSITING) +#include "RenderLayerCompositor.h" +#endif + +#include "VideoFrameChromium.h" +#include "VideoFrameChromiumImpl.h" #include "WebCanvas.h" #include "WebCString.h" #include "WebFrameClient.h" #include "WebFrameImpl.h" #include "WebKit.h" #include "WebKitClient.h" +#include "WebMediaElement.h" #include "WebMediaPlayer.h" #include "WebMimeRegistry.h" #include "WebRect.h" #include "WebSize.h" #include "WebString.h" #include "WebURL.h" +#include "WebViewImpl.h" // WebCommon.h defines WEBKIT_USING_SKIA so this has to be included last. #if WEBKIT_USING_SKIA @@ -36,6 +45,7 @@ #endif #include <wtf/Assertions.h> +#include <wtf/text/CString.h> using namespace WebCore; @@ -45,6 +55,7 @@ static WebMediaPlayer* createWebMediaPlayer( WebMediaPlayerClient* client, Frame* frame) { WebFrameImpl* webFrame = WebFrameImpl::fromFrame(frame); + if (!webFrame->client()) return 0; return webFrame->client()->createMediaPlayer(webFrame, client); @@ -71,8 +82,29 @@ void WebMediaPlayerClientImpl::registerSelf(MediaEngineRegistrar registrar) } } +WebMediaPlayerClientImpl* WebMediaPlayerClientImpl::fromMediaElement(const WebMediaElement* element) +{ + PlatformMedia pm = element->constUnwrap<HTMLMediaElement>()->platformMedia(); + return static_cast<WebMediaPlayerClientImpl*>(pm.media.chromiumMediaPlayer); +} + +WebMediaPlayer* WebMediaPlayerClientImpl::mediaPlayer() const +{ + return m_webMediaPlayer.get(); +} + // WebMediaPlayerClient -------------------------------------------------------- +WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl() +{ + // VideoLayerChromium may outlive this object so make sure all frames are + // released. +#if USE(ACCELERATED_COMPOSITING) + if (m_videoLayer.get()) + m_videoLayer->releaseCurrentFrame(); +#endif +} + void WebMediaPlayerClientImpl::networkStateChanged() { ASSERT(m_mediaPlayer); @@ -83,6 +115,10 @@ void WebMediaPlayerClientImpl::readyStateChanged() { ASSERT(m_mediaPlayer); m_mediaPlayer->readyStateChanged(); +#if USE(ACCELERATED_COMPOSITING) + if (hasVideo() && supportsAcceleratedRendering() && !m_videoLayer.get()) + m_videoLayer = VideoLayerChromium::create(0, this); +#endif } void WebMediaPlayerClientImpl::volumeChanged(float newVolume) @@ -106,6 +142,10 @@ void WebMediaPlayerClientImpl::timeChanged() void WebMediaPlayerClientImpl::repaint() { ASSERT(m_mediaPlayer); +#if USE(ACCELERATED_COMPOSITING) + if (m_videoLayer.get() && supportsAcceleratedRendering()) + m_videoLayer->setNeedsDisplay(FloatRect(0, 0, m_videoLayer->bounds().width(), m_videoLayer->bounds().height())); +#endif m_mediaPlayer->repaint(); } @@ -133,12 +173,27 @@ void WebMediaPlayerClientImpl::sawUnsupportedTracks() m_mediaPlayer->mediaPlayerClient()->mediaPlayerSawUnsupportedTracks(m_mediaPlayer); } +float WebMediaPlayerClientImpl::volume() const +{ + if (m_mediaPlayer) + return m_mediaPlayer->volume(); + return 0.0f; +} + // MediaPlayerPrivateInterface ------------------------------------------------- void WebMediaPlayerClientImpl::load(const String& url) { Frame* frame = static_cast<HTMLMediaElement*>( m_mediaPlayer->mediaPlayerClient())->document()->frame(); + + // Video frame object is owned by WebMediaPlayer. Before destroying + // WebMediaPlayer all frames need to be released. +#if USE(ACCELERATED_COMPOSITING) + if (m_videoLayer.get()) + m_videoLayer->releaseCurrentFrame(); +#endif + m_webMediaPlayer.set(createWebMediaPlayer(this, frame)); if (m_webMediaPlayer.get()) m_webMediaPlayer->load(KURL(ParsedURLString, url)); @@ -150,6 +205,22 @@ void WebMediaPlayerClientImpl::cancelLoad() m_webMediaPlayer->cancelLoad(); } +#if USE(ACCELERATED_COMPOSITING) +PlatformLayer* WebMediaPlayerClientImpl::platformLayer() const +{ + ASSERT(m_supportsAcceleratedCompositing); + return m_videoLayer.get(); +} +#endif + +PlatformMedia WebMediaPlayerClientImpl::platformMedia() const +{ + PlatformMedia pm; + pm.type = PlatformMedia::ChromiumMediaPlayerType; + pm.media.chromiumMediaPlayer = const_cast<WebMediaPlayerClientImpl*>(this); + return pm; +} + void WebMediaPlayerClientImpl::play() { if (m_webMediaPlayer.get()) @@ -331,7 +402,14 @@ void WebMediaPlayerClientImpl::paint(GraphicsContext* context, const IntRect& re // check. if (m_webMediaPlayer.get() && !context->paintingDisabled()) { #if WEBKIT_USING_SKIA - m_webMediaPlayer->paint(context->platformContext()->canvas(), rect); + PlatformGraphicsContext* platformContext = context->platformContext(); + WebCanvas* canvas = platformContext->canvas(); + + canvas->saveLayerAlpha(0, platformContext->getNormalizedAlpha()); + + m_webMediaPlayer->paint(canvas, rect); + + canvas->restore(); #elif WEBKIT_USING_CG m_webMediaPlayer->paint(context->platformContext(), rect); #else @@ -361,10 +439,52 @@ MediaPlayer::MovieLoadType WebMediaPlayerClientImpl::movieLoadType() const return MediaPlayer::Unknown; } +#if USE(ACCELERATED_COMPOSITING) +bool WebMediaPlayerClientImpl::supportsAcceleratedRendering() const +{ + return m_supportsAcceleratedCompositing; +} + +VideoFrameChromium* WebMediaPlayerClientImpl::getCurrentFrame() +{ + VideoFrameChromium* videoFrame = 0; + if (m_webMediaPlayer.get()) { + WebVideoFrame* webkitVideoFrame = m_webMediaPlayer->getCurrentFrame(); + if (webkitVideoFrame) + videoFrame = new VideoFrameChromiumImpl(webkitVideoFrame); + } + return videoFrame; +} + +void WebMediaPlayerClientImpl::putCurrentFrame(VideoFrameChromium* videoFrame) +{ + if (videoFrame) { + if (m_webMediaPlayer.get()) { + m_webMediaPlayer->putCurrentFrame( + VideoFrameChromiumImpl::toWebVideoFrame(videoFrame)); + } + delete videoFrame; + } +} +#endif + MediaPlayerPrivateInterface* WebMediaPlayerClientImpl::create(MediaPlayer* player) { WebMediaPlayerClientImpl* client = new WebMediaPlayerClientImpl(); client->m_mediaPlayer = player; + +#if USE(ACCELERATED_COMPOSITING) + Frame* frame = static_cast<HTMLMediaElement*>( + client->m_mediaPlayer->mediaPlayerClient())->document()->frame(); + + // This does not actually check whether the hardware can support accelerated + // compositing, but only if the flag is set. However, this is checked lazily + // in WebViewImpl::setIsAcceleratedCompositingActive() and will fail there + // if necessary. + client->m_supportsAcceleratedCompositing = + frame->contentRenderer()->compositor()->hasAcceleratedCompositing(); +#endif + return client; } @@ -395,6 +515,10 @@ MediaPlayer::SupportsType WebMediaPlayerClientImpl::supportsType(const String& t WebMediaPlayerClientImpl::WebMediaPlayerClientImpl() : m_mediaPlayer(0) +#if USE(ACCELERATED_COMPOSITING) + , m_videoLayer(0) + , m_supportsAcceleratedCompositing(false) +#endif { } diff --git a/WebKit/chromium/src/WebMediaPlayerClientImpl.h b/WebKit/chromium/src/WebMediaPlayerClientImpl.h index 4adbed2..ca7c43c 100644 --- a/WebKit/chromium/src/WebMediaPlayerClientImpl.h +++ b/WebKit/chromium/src/WebMediaPlayerClientImpl.h @@ -34,23 +34,37 @@ #if ENABLE(VIDEO) #include "MediaPlayerPrivate.h" +#include "VideoFrameChromium.h" +#include "VideoFrameProvider.h" +#include "VideoLayerChromium.h" #include "WebMediaPlayerClient.h" #include <wtf/OwnPtr.h> namespace WebKit { +class WebMediaElement; class WebMediaPlayer; // This class serves as a bridge between WebCore::MediaPlayer and // WebKit::WebMediaPlayer. -class WebMediaPlayerClientImpl : public WebMediaPlayerClient - , public WebCore::MediaPlayerPrivateInterface { +class WebMediaPlayerClientImpl : public WebCore::MediaPlayerPrivateInterface +#if USE(ACCELERATED_COMPOSITING) + , public WebCore::VideoFrameProvider +#endif + , public WebMediaPlayerClient { + public: static bool isEnabled(); static void setIsEnabled(bool); static void registerSelf(WebCore::MediaEngineRegistrar); + static WebMediaPlayerClientImpl* fromMediaElement(const WebMediaElement* element); + + // Returns the encapsulated WebKit::WebMediaPlayer. + WebMediaPlayer* mediaPlayer() const; + // WebMediaPlayerClient methods: + virtual ~WebMediaPlayerClientImpl(); virtual void networkStateChanged(); virtual void readyStateChanged(); virtual void volumeChanged(float); @@ -61,10 +75,15 @@ public: virtual void rateChanged(); virtual void sizeChanged(); virtual void sawUnsupportedTracks(); + virtual float volume() const; // MediaPlayerPrivateInterface methods: - virtual void load(const WebCore::String& url); + virtual void load(const WTF::String& url); virtual void cancelLoad(); +#if USE(ACCELERATED_COMPOSITING) + virtual WebCore::PlatformLayer* platformLayer() const; +#endif + virtual WebCore::PlatformMedia platformMedia() const; virtual void play(); virtual void pause(); virtual bool supportsFullscreen() const; @@ -94,17 +113,28 @@ public: virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&); virtual bool hasSingleSecurityOrigin() const; virtual WebCore::MediaPlayer::MovieLoadType movieLoadType() const; +#if USE(ACCELERATED_COMPOSITING) + virtual bool supportsAcceleratedRendering() const; + + // VideoFrameProvider methods: + virtual WebCore::VideoFrameChromium* getCurrentFrame(); + virtual void putCurrentFrame(WebCore::VideoFrameChromium*); +#endif private: WebMediaPlayerClientImpl(); static WebCore::MediaPlayerPrivateInterface* create(WebCore::MediaPlayer*); - static void getSupportedTypes(WTF::HashSet<WebCore::String>&); + static void getSupportedTypes(WTF::HashSet<WTF::String>&); static WebCore::MediaPlayer::SupportsType supportsType( - const WebCore::String& type, const WebCore::String& codecs); + const WTF::String& type, const WTF::String& codecs); WebCore::MediaPlayer* m_mediaPlayer; OwnPtr<WebMediaPlayer> m_webMediaPlayer; +#if USE(ACCELERATED_COMPOSITING) + RefPtr<WebCore::VideoLayerChromium> m_videoLayer; + bool m_supportsAcceleratedCompositing; +#endif static bool m_isEnabled; }; diff --git a/WebKit/chromium/src/WebNamedNodeMap.cpp b/WebKit/chromium/src/WebNamedNodeMap.cpp new file mode 100644 index 0000000..e2455e6 --- /dev/null +++ b/WebKit/chromium/src/WebNamedNodeMap.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebNamedNodeMap.h" + +#include "NamedNodeMap.h" +#include "Node.h" +#include "WebAttribute.h" +#include "WebNode.h" +#include <wtf/PassRefPtr.h> + +using namespace WebCore; + +namespace WebKit { + +void WebNamedNodeMap::reset() +{ + m_private.reset(); +} + +void WebNamedNodeMap::assign(const WebNamedNodeMap& other) +{ + m_private = other.m_private; +} + +WebNamedNodeMap::WebNamedNodeMap(const PassRefPtr<NamedNodeMap>& other) + : m_private(other) +{ +} + +unsigned WebNamedNodeMap::length() const +{ + return m_private->length(); +} + +WebAttribute WebNamedNodeMap::attributeItem(unsigned index) const +{ + return WebAttribute(m_private->attributeItem(index)); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebNode.cpp b/WebKit/chromium/src/WebNode.cpp index 9fbf573..e91d1ee 100644 --- a/WebKit/chromium/src/WebNode.cpp +++ b/WebKit/chromium/src/WebNode.cpp @@ -32,15 +32,16 @@ #include "WebNode.h" #include "Document.h" +#include "Element.h" #include "Frame.h" #include "FrameLoaderClientImpl.h" #include "Node.h" #include "NodeList.h" #include "EventListenerWrapper.h" +#include "WebDOMEvent.h" +#include "WebDOMEventListener.h" #include "WebDocument.h" -#include "WebEvent.h" -#include "WebEventListener.h" #include "WebFrameImpl.h" #include "WebNodeList.h" #include "WebString.h" @@ -48,26 +49,28 @@ #include "markup.h" -#include <wtf/PassRefPtr.h> - using namespace WebCore; namespace WebKit { -class WebNodePrivate : public Node { -}; - void WebNode::reset() { - assign(0); + m_private.reset(); } void WebNode::assign(const WebNode& other) { - WebNodePrivate* p = const_cast<WebNodePrivate*>(other.m_private); - if (p) - p->ref(); - assign(p); + m_private = other.m_private; +} + +bool WebNode::equals(const WebNode& n) const +{ + return (m_private.get() == n.m_private.get()); +} + +bool WebNode::lessThan(const WebNode& n) const +{ + return (m_private.get() < n.m_private.get()); } WebNode::NodeType WebNode::nodeType() const @@ -77,7 +80,7 @@ WebNode::NodeType WebNode::nodeType() const WebNode WebNode::parentNode() const { - return PassRefPtr<Node>(const_cast<Node*>(m_private->parentNode())); + return WebNode(const_cast<ContainerNode*>(m_private->parentNode())); } WebString WebNode::nodeName() const @@ -97,35 +100,6 @@ bool WebNode::setNodeValue(const WebString& value) return !exceptionCode; } -WebNode::WebNode(const PassRefPtr<Node>& node) - : m_private(static_cast<WebNodePrivate*>(node.releaseRef())) -{ -} - -WebNode& WebNode::operator=(const PassRefPtr<Node>& node) -{ - assign(static_cast<WebNodePrivate*>(node.releaseRef())); - return *this; -} - -WebNode::operator PassRefPtr<Node>() const -{ - return PassRefPtr<Node>(const_cast<WebNodePrivate*>(m_private)); -} - -void WebNode::assign(WebNodePrivate* p) -{ - // p is already ref'd for us by the caller - if (m_private) - m_private->deref(); - m_private = p; -} - -WebFrame* WebNode::frame() const -{ - return WebFrameImpl::fromFrame(m_private->document()->frame()); -} - WebDocument WebNode::document() const { return WebDocument(m_private->document()); @@ -163,7 +137,7 @@ WebNodeList WebNode::childNodes() WebString WebNode::createMarkup() const { - return WebCore::createMarkup(m_private); + return WebCore::createMarkup(m_private.get()); } bool WebNode::isTextNode() const @@ -171,27 +145,64 @@ bool WebNode::isTextNode() const return m_private->isTextNode(); } +bool WebNode::isContentEditable() const +{ + return m_private->isContentEditable(); +} + bool WebNode::isElementNode() const { return m_private->isElementNode(); } -void WebNode::addEventListener(const WebString& eventType, WebEventListener* listener, bool useCapture) +void WebNode::addEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture) { EventListenerWrapper* listenerWrapper = - listener->createEventListenerWrapper(eventType, useCapture, m_private); + listener->createEventListenerWrapper(eventType, useCapture, m_private.get()); // The listenerWrapper is only referenced by the actual Node. Once it goes // away, the wrapper notifies the WebEventListener so it can clear its // pointer to it. m_private->addEventListener(eventType, adoptRef(listenerWrapper), useCapture); } -void WebNode::removeEventListener(const WebString& eventType, WebEventListener* listener, bool useCapture) +void WebNode::removeEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture) { EventListenerWrapper* listenerWrapper = - listener->getEventListenerWrapper(eventType, useCapture, m_private); + listener->getEventListenerWrapper(eventType, useCapture, m_private.get()); m_private->removeEventListener(eventType, listenerWrapper, useCapture); // listenerWrapper is now deleted. } +void WebNode::simulateClick() +{ + RefPtr<Event> noEvent; + m_private->dispatchSimulatedClick(noEvent); +} + +WebNodeList WebNode::getElementsByTagName(const WebString& tag) const +{ + return WebNodeList(m_private->getElementsByTagName(tag)); +} + +bool WebNode::hasNonEmptyBoundingBox() const +{ + return m_private->hasNonEmptyBoundingBox(); +} + +WebNode::WebNode(const PassRefPtr<Node>& node) + : m_private(node) +{ +} + +WebNode& WebNode::operator=(const PassRefPtr<Node>& node) +{ + m_private = node; + return *this; +} + +WebNode::operator PassRefPtr<Node>() const +{ + return m_private.get(); +} + } // namespace WebKit diff --git a/WebKit/chromium/src/WebNotification.cpp b/WebKit/chromium/src/WebNotification.cpp index 1f6916e..c3b1f51 100644 --- a/WebKit/chromium/src/WebNotification.cpp +++ b/WebKit/chromium/src/WebNotification.cpp @@ -34,8 +34,10 @@ #if ENABLE(NOTIFICATIONS) #include "Notification.h" +#include "UserGestureIndicator.h" #include "WebString.h" +#include "WebTextDirection.h" #include "WebURL.h" #include <wtf/PassRefPtr.h> @@ -76,10 +78,10 @@ WebURL WebNotification::url() const return m_private->url(); } -WebString WebNotification::icon() const +WebURL WebNotification::iconURL() const { ASSERT(!isHTML()); - return m_private->contents().icon(); + return m_private->iconURL(); } WebString WebNotification::title() const @@ -94,6 +96,29 @@ WebString WebNotification::body() const return m_private->contents().body(); } +// FIXME: remove dir() when unreferenced. Being replaced by direction(). +WebString WebNotification::dir() const +{ + return m_private->dir(); +} + +WebTextDirection WebNotification::direction() const +{ + return (m_private->direction() == RTL) ? + WebTextDirectionRightToLeft : + WebTextDirectionLeftToRight; +} + +WebString WebNotification::replaceId() const +{ + return m_private->replaceId(); +} + +void WebNotification::detachPresenter() +{ + m_private->detachPresenter(); +} + void WebNotification::dispatchDisplayEvent() { RefPtr<Event> event = Event::create("display", false, true); @@ -114,6 +139,14 @@ void WebNotification::dispatchCloseEvent(bool /* byUser */) m_private->dispatchEvent(event.release()); } +void WebNotification::dispatchClickEvent() +{ + // Make sure clicks on notifications are treated as user gestures. + UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); + RefPtr<Event> event = Event::create(eventNames().clickEvent, false, true); + m_private->dispatchEvent(event.release()); +} + WebNotification::WebNotification(const WTF::PassRefPtr<Notification>& notification) : m_private(static_cast<WebNotificationPrivate*>(notification.releaseRef())) { diff --git a/WebKit/chromium/src/AutocompletePopupMenuClient.cpp b/WebKit/chromium/src/WebOptionElement.cpp index 9620ffc..49bff3b 100644 --- a/WebKit/chromium/src/AutocompletePopupMenuClient.cpp +++ b/WebKit/chromium/src/WebOptionElement.cpp @@ -29,56 +29,72 @@ */ #include "config.h" -#include "AutocompletePopupMenuClient.h" +#include "WebOptionElement.h" -#include "HTMLInputElement.h" +#include "HTMLNames.h" +#include "HTMLOptionElement.h" +#include "HTMLSelectElement.h" #include "WebString.h" -#include "WebVector.h" +#include <wtf/PassRefPtr.h> using namespace WebCore; namespace WebKit { -unsigned AutocompletePopupMenuClient::getSuggestionsCount() const +void WebOptionElement::setValue(const WebString& newValue) { - return m_suggestions.size(); + return unwrap<HTMLOptionElement>()->setValue(newValue); } -WebString AutocompletePopupMenuClient::getSuggestion(unsigned listIndex) const +WebString WebOptionElement::value() const { - ASSERT(listIndex >= 0 && listIndex < m_suggestions.size()); - return m_suggestions[listIndex]; + return constUnwrap<HTMLOptionElement>()->value(); } -void AutocompletePopupMenuClient::removeSuggestionAtIndex(unsigned listIndex) +int WebOptionElement::index() const { - ASSERT(listIndex >= 0 && listIndex < m_suggestions.size()); - m_suggestions.remove(listIndex); + return constUnwrap<HTMLOptionElement>()->index(); } -void AutocompletePopupMenuClient::initialize( - HTMLInputElement* textField, - const WebVector<WebString>& suggestions, - int defaultSuggestionIndex) +WebString WebOptionElement::text() const { - ASSERT(defaultSuggestionIndex < static_cast<int>(suggestions.size())); + return constUnwrap<HTMLOptionElement>()->text(); +} + +bool WebOptionElement::defaultSelected() const +{ + return constUnwrap<HTMLOptionElement>()->defaultSelected(); +} - // The suggestions must be set before initializing the - // SuggestionsPopupMenuClient. - setSuggestions(suggestions); +void WebOptionElement::setDefaultSelected(bool newSelected) +{ + return unwrap<HTMLOptionElement>()->setDefaultSelected(newSelected); +} - SuggestionsPopupMenuClient::initialize(textField, defaultSuggestionIndex); +WebString WebOptionElement::label() const +{ + return constUnwrap<HTMLOptionElement>()->label(); } -void AutocompletePopupMenuClient::setSuggestions(const WebVector<WebString>& suggestions) +bool WebOptionElement::isEnabled() const { - m_suggestions.clear(); - for (size_t i = 0; i < suggestions.size(); ++i) - m_suggestions.append(suggestions[i]); + return !(constUnwrap<HTMLOptionElement>()->disabled()); +} - // Try to preserve selection if possible. - if (getSelectedIndex() >= static_cast<int>(suggestions.size())) - setSelectedIndex(-1); +WebOptionElement::WebOptionElement(const PassRefPtr<HTMLOptionElement>& elem) + : WebFormControlElement(elem) +{ +} + +WebOptionElement& WebOptionElement::operator=(const PassRefPtr<HTMLOptionElement>& elem) +{ + m_private = elem; + return *this; +} + +WebOptionElement::operator PassRefPtr<HTMLOptionElement>() const +{ + return static_cast<HTMLOptionElement*>(m_private.get()); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebPageSerializer.cpp b/WebKit/chromium/src/WebPageSerializer.cpp index 1010285..1fda484 100644 --- a/WebKit/chromium/src/WebPageSerializer.cpp +++ b/WebKit/chromium/src/WebPageSerializer.cpp @@ -32,7 +32,6 @@ #include "WebPageSerializer.h" #include "KURL.h" -#include "PlatformString.h" #include "WebFrame.h" #include "WebPageSerializerClient.h" @@ -41,6 +40,8 @@ #include "WebURL.h" #include "WebVector.h" +#include <wtf/text/StringConcatenate.h> + using namespace WebCore; namespace WebKit { @@ -59,8 +60,7 @@ bool WebPageSerializer::serialize(WebFrame* frame, WebString WebPageSerializer::generateMetaCharsetDeclaration(const WebString& charset) { - return String::format("<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">", - charset.utf8().data()); + return makeString("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=", static_cast<const String&>(charset), "\">"); } WebString WebPageSerializer::generateMarkOfTheWebDeclaration(const WebURL& url) @@ -72,10 +72,9 @@ WebString WebPageSerializer::generateMarkOfTheWebDeclaration(const WebURL& url) WebString WebPageSerializer::generateBaseTagDeclaration(const WebString& baseTarget) { - String targetDeclaration; - if (!baseTarget.isEmpty()) - targetDeclaration = String::format(" target=\"%s\"", baseTarget.utf8().data()); - return String::format("<BASE href=\".\"%s>", targetDeclaration.utf8().data()); + if (baseTarget.isEmpty()) + return makeString("<base href=\".\">"); + return makeString("<base href=\".\" target=\"", static_cast<const String&>(baseTarget), "\">"); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebPageSerializerImpl.cpp b/WebKit/chromium/src/WebPageSerializerImpl.cpp index d5b2b7f..0d85d78 100644 --- a/WebKit/chromium/src/WebPageSerializerImpl.cpp +++ b/WebKit/chromium/src/WebPageSerializerImpl.cpp @@ -88,8 +88,6 @@ #include "HTMLMetaElement.h" #include "HTMLNames.h" #include "KURL.h" -#include "PlatformString.h" -#include "StringBuilder.h" #include "TextEncoding.h" #include "markup.h" @@ -107,22 +105,22 @@ namespace WebKit { // contegious string is found in the page. static const unsigned dataBufferCapacity = 65536; -WebPageSerializerImpl::SerializeDomParam::SerializeDomParam(const KURL& currentFrameURL, +WebPageSerializerImpl::SerializeDomParam::SerializeDomParam(const KURL& url, const TextEncoding& textEncoding, - Document* doc, + Document* document, const String& directoryName) - : currentFrameURL(currentFrameURL) + : url(url) , textEncoding(textEncoding) - , doc(doc) + , document(document) , directoryName(directoryName) - , hasDoctype(false) - , hasCheckedMeta(false) + , isHTMLDocument(document->isHTMLDocument()) + , haveSeenDocType(false) + , haveAddedCharsetDeclaration(false) , skipMetaElement(0) , isInScriptOrStyleTag(false) - , hasDocDeclaration(false) + , haveAddedXMLProcessingDirective(false) + , haveAddedContentsBeforeEnd(false) { - // Cache the value since we check it lots of times. - isHTMLDocument = doc->isHTMLDocument(); } String WebPageSerializerImpl::preActionBeforeSerializeOpenTag( @@ -150,41 +148,41 @@ String WebPageSerializerImpl::preActionBeforeSerializeOpenTag( } } else if (element->hasTagName(HTMLNames::htmlTag)) { // Check something before processing the open tag of HEAD element. - // First we add doc type declaration if original doc has it. - if (!param->hasDoctype) { - param->hasDoctype = true; - result.append(createMarkup(param->doc->doctype())); + // First we add doc type declaration if original document has it. + if (!param->haveSeenDocType) { + param->haveSeenDocType = true; + result.append(createMarkup(param->document->doctype())); } // Add MOTW declaration before html tag. // See http://msdn2.microsoft.com/en-us/library/ms537628(VS.85).aspx. - result.append(WebPageSerializer::generateMarkOfTheWebDeclaration(param->currentFrameURL)); + result.append(WebPageSerializer::generateMarkOfTheWebDeclaration(param->url)); } else if (element->hasTagName(HTMLNames::baseTag)) { // Comment the BASE tag when serializing dom. result.append("<!--"); } } else { // Write XML declaration. - if (!param->hasDocDeclaration) { - param->hasDocDeclaration = true; + if (!param->haveAddedXMLProcessingDirective) { + param->haveAddedXMLProcessingDirective = true; // Get encoding info. - String xmlEncoding = param->doc->xmlEncoding(); + String xmlEncoding = param->document->xmlEncoding(); if (xmlEncoding.isEmpty()) - xmlEncoding = param->doc->frame()->loader()->encoding(); + xmlEncoding = param->document->frame()->loader()->writer()->encoding(); if (xmlEncoding.isEmpty()) xmlEncoding = UTF8Encoding().name(); result.append("<?xml version=\""); - result.append(param->doc->xmlVersion()); + result.append(param->document->xmlVersion()); result.append("\" encoding=\""); result.append(xmlEncoding); - if (param->doc->xmlStandalone()) + if (param->document->xmlStandalone()) result.append("\" standalone=\"yes"); result.append("\"?>\n"); } - // Add doc type declaration if original doc has it. - if (!param->hasDoctype) { - param->hasDoctype = true; - result.append(createMarkup(param->doc->doctype())); + // Add doc type declaration if original document has it. + if (!param->haveSeenDocType) { + param->haveSeenDocType = true; + result.append(createMarkup(param->document->doctype())); } } return result.toString(); @@ -195,13 +193,13 @@ String WebPageSerializerImpl::postActionAfterSerializeOpenTag( { StringBuilder result; - param->hasAddedContentsBeforeEnd = false; + param->haveAddedContentsBeforeEnd = false; if (!param->isHTMLDocument) return result.toString(); // Check after processing the open tag of HEAD element - if (!param->hasCheckedMeta + if (!param->haveAddedCharsetDeclaration && element->hasTagName(HTMLNames::headTag)) { - param->hasCheckedMeta = true; + param->haveAddedCharsetDeclaration = true; // Check meta element. WebKit only pre-parse the first 512 bytes // of the document. If the whole <HEAD> is larger and meta is the // end of head part, then this kind of pages aren't decoded correctly @@ -212,7 +210,7 @@ String WebPageSerializerImpl::postActionAfterSerializeOpenTag( result.append(WebPageSerializer::generateMetaCharsetDeclaration( String(param->textEncoding.name()))); - param->hasAddedContentsBeforeEnd = true; + param->haveAddedContentsBeforeEnd = true; // Will search each META which has charset declaration, and skip them all // in PreActionBeforeSerializeOpenTag. } else if (element->hasTagName(HTMLNames::scriptTag) @@ -259,7 +257,7 @@ String WebPageSerializerImpl::postActionAfterSerializeEndTag( result.append("-->"); // Append a new base tag declaration. result.append(WebPageSerializer::generateBaseTagDeclaration( - param->doc->baseTarget())); + param->document->baseTarget())); } return result.toString(); @@ -271,27 +269,27 @@ void WebPageSerializerImpl::saveHTMLContentToBuffer( m_dataBuffer.append(result); encodeAndFlushBuffer(WebPageSerializerClient::CurrentFrameIsNotFinished, param, - 0); + DoNotForceFlush); } void WebPageSerializerImpl::encodeAndFlushBuffer( WebPageSerializerClient::PageSerializationStatus status, SerializeDomParam* param, - bool force) + FlushOption flushOption) { // Data buffer is not full nor do we want to force flush. - if (!force && m_dataBuffer.length() <= dataBufferCapacity) + if (flushOption != ForceFlush && m_dataBuffer.length() <= dataBufferCapacity) return; String content = m_dataBuffer.toString(); - m_dataBuffer.clear(); + m_dataBuffer = StringBuilder(); // Convert the unicode content to target encoding CString encodedContent = param->textEncoding.encode( content.characters(), content.length(), EntitiesForUnencodables); // Send result to the client. - m_client->didSerializeDataForFrame(param->currentFrameURL, + m_client->didSerializeDataForFrame(param->url, WebCString(encodedContent.data(), encodedContent.length()), status); } @@ -306,7 +304,7 @@ void WebPageSerializerImpl::openTagToString(const Element* element, if (needSkip) return; // Add open tag - result += "<" + element->nodeName(); + result += "<" + element->nodeName().lower(); // Go through all attributes and serialize them. const NamedNodeMap *attrMap = element->attributes(true); if (attrMap) { @@ -329,7 +327,7 @@ void WebPageSerializerImpl::openTagToString(const Element* element, result += attrValue; else { // Get the absolute link - String completeURL = param->doc->completeURL(attrValue); + String completeURL = param->document->completeURL(attrValue); // Check whether we have local files for those link. if (m_localLinks.contains(completeURL)) { if (!m_localDirectoryName.isEmpty()) @@ -352,7 +350,7 @@ void WebPageSerializerImpl::openTagToString(const Element* element, // Do post action for open tag. String addedContents = postActionAfterSerializeOpenTag(element, param); // Complete the open tag for element when it has child/children. - if (element->hasChildNodes() || param->hasAddedContentsBeforeEnd) + if (element->hasChildNodes() || param->haveAddedContentsBeforeEnd) result += ">"; // Append the added contents generate in post action of open tag. result += addedContents; @@ -372,20 +370,19 @@ void WebPageSerializerImpl::endTagToString(const Element* element, if (needSkip) return; // Write end tag when element has child/children. - if (element->hasChildNodes() || param->hasAddedContentsBeforeEnd) { + if (element->hasChildNodes() || param->haveAddedContentsBeforeEnd) { result += "</"; - result += element->nodeName(); + result += element->nodeName().lower(); result += ">"; } else { // Check whether we have to write end tag for empty element. if (param->isHTMLDocument) { result += ">"; - const HTMLElement* htmlElement = - static_cast<const HTMLElement*>(element); - if (htmlElement->endTagRequirement() == TagStatusRequired) { + // FIXME: This code is horribly wrong. WebPageSerializerImpl must die. + if (!static_cast<const HTMLElement*>(element)->ieForbidsInsertHTML()) { // We need to write end tag when it is required. result += "</"; - result += element->nodeName(); + result += element->nodeName().lower(); result += ">"; } } else { @@ -423,7 +420,7 @@ void WebPageSerializerImpl::buildContentForNode(const Node* node, break; // Document type node can be in DOM? case Node::DOCUMENT_TYPE_NODE: - param->hasDoctype = true; + param->haveSeenDocType = true; default: // For other type node, call default action. saveHTMLContentToBuffer(createMarkup(node), param); @@ -457,7 +454,7 @@ WebPageSerializerImpl::WebPageSerializerImpl(WebFrame* frame, m_localLinks.set(url.string(), localPaths[i]); } - ASSERT(!m_dataBuffer.length()); + ASSERT(m_dataBuffer.isEmpty()); } void WebPageSerializerImpl::collectTargetFrames() @@ -492,55 +489,37 @@ void WebPageSerializerImpl::collectTargetFrames() bool WebPageSerializerImpl::serialize() { - // Collect target frames. if (!m_framesCollected) collectTargetFrames(); + bool didSerialization = false; - // Get KURL for main frame. - KURL mainPageURL = m_specifiedWebFrameImpl->frame()->loader()->url(); + KURL mainURL = m_specifiedWebFrameImpl->frame()->document()->url(); - // Go through all frames for serializing DOM for whole page, include - // sub-frames. - for (int i = 0; i < static_cast<int>(m_frames.size()); ++i) { - // Get current serializing frame. - WebFrameImpl* currentFrame = m_frames[i]; - // Get current using document. - Document* currentDoc = currentFrame->frame()->document(); - // Get current frame's URL. - const KURL& currentFrameURL = currentFrame->frame()->loader()->url(); - - // Check whether we have done this document. - if (m_localLinks.contains(currentFrameURL.string())) { - // A new document, we will serialize it. - didSerialization = true; - // Get target encoding for current document. - String encoding = currentFrame->frame()->loader()->encoding(); - // Create the text encoding object with target encoding. - TextEncoding textEncoding(encoding); - // Construct serialize parameter for late processing document. - SerializeDomParam param(currentFrameURL, - encoding.length() ? textEncoding : UTF8Encoding(), - currentDoc, - currentFrameURL == mainPageURL ? m_localDirectoryName : ""); - - // Process current document. - Element* rootElement = currentDoc->documentElement(); - if (rootElement) - buildContentForNode(rootElement, ¶m); - - // Flush the remainder data and finish serializing current frame. - encodeAndFlushBuffer(WebPageSerializerClient::CurrentFrameIsFinished, - ¶m, - 1); - } + for (unsigned i = 0; i < m_frames.size(); ++i) { + WebFrameImpl* 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; + + String encoding = webFrame->frame()->loader()->writer()->encoding(); + const TextEncoding& textEncoding = encoding.isEmpty() ? UTF8Encoding() : TextEncoding(encoding); + 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); } - // We have done call frames, so we send message to embedder to tell it that - // frames are finished serializing. - ASSERT(!m_dataBuffer.length()); - m_client->didSerializeDataForFrame(KURL(), - WebCString("", 0), - WebPageSerializerClient::AllFramesAreFinished); + ASSERT(m_dataBuffer.isEmpty()); + m_client->didSerializeDataForFrame(KURL(), WebCString("", 0), WebPageSerializerClient::AllFramesAreFinished); return didSerialization; } diff --git a/WebKit/chromium/src/WebPageSerializerImpl.h b/WebKit/chromium/src/WebPageSerializerImpl.h index 8f6a99f..5ee8805 100644 --- a/WebKit/chromium/src/WebPageSerializerImpl.h +++ b/WebKit/chromium/src/WebPageSerializerImpl.h @@ -31,11 +31,12 @@ #ifndef WebPageSerializerImpl_h #define WebPageSerializerImpl_h -#include "PlatformString.h" -#include "StringBuilder.h" -#include "StringHash.h" +#include <wtf/Forward.h> #include <wtf/HashMap.h> #include <wtf/Vector.h> +#include <wtf/text/StringBuilder.h> +#include <wtf/text/StringHash.h> +#include <wtf/text/WTFString.h> #include "WebEntities.h" #include "WebPageSerializer.h" @@ -47,7 +48,6 @@ namespace WebCore { class Document; class Element; class Node; -class String; class TextEncoding; } @@ -93,12 +93,12 @@ private: WebPageSerializerClient* m_client; // This hash map is used to map resource URL of original link to its local // file path. - typedef HashMap<WebCore::String, WebCore::String> LinkLocalPathMap; + typedef HashMap<WTF::String, WTF::String> LinkLocalPathMap; // local_links_ include all pair of local resource path and corresponding // original link. LinkLocalPathMap m_localLinks; // Data buffer for saving result of serialized DOM data. - WebCore::StringBuilder m_dataBuffer; + StringBuilder m_dataBuffer; // Passing true to recursive_serialization_ indicates we will serialize not // only the specified frame but also all sub-frames in the specific frame. // Otherwise we only serialize the specified frame excluded all sub-frames. @@ -107,7 +107,7 @@ private: // serialized or not; bool m_framesCollected; // Local directory name of all local resource files. - WebCore::String m_localDirectoryName; + WTF::String m_localDirectoryName; // Vector for saving all frames which need to be serialized. Vector<WebFrameImpl*> m_frames; @@ -116,73 +116,63 @@ private: WebEntities m_xmlEntities; struct SerializeDomParam { - // Frame URL of current processing document presented by GURL - const WebCore::KURL& currentFrameURL; - // Current using text encoding object. + const WebCore::KURL& url; const WebCore::TextEncoding& textEncoding; - - // Document object of current frame. - WebCore::Document* doc; - // Local directory name of all local resource files. - const WebCore::String& directoryName; - - // Flag indicates current doc is html document or not. It's a cache value - // of Document.isHTMLDocument(). - bool isHTMLDocument; - // Flag which indicate whether we have met document type declaration. - bool hasDoctype; - // Flag which indicate whether will process meta issue. - bool hasCheckedMeta; + WebCore::Document* document; + const WTF::String& directoryName; + bool isHTMLDocument; // document.isHTMLDocument() + bool haveSeenDocType; + bool haveAddedCharsetDeclaration; // This meta element need to be skipped when serializing DOM. const WebCore::Element* skipMetaElement; // Flag indicates we are in script or style tag. bool isInScriptOrStyleTag; - // Flag indicates whether we have written xml document declaration. - // It is only used in xml document - bool hasDocDeclaration; + bool haveAddedXMLProcessingDirective; // Flag indicates whether we have added additional contents before end tag. // This flag will be re-assigned in each call of function // PostActionAfterSerializeOpenTag and it could be changed in function // PreActionBeforeSerializeEndTag if the function adds new contents into // serialization stream. - bool hasAddedContentsBeforeEnd; + bool haveAddedContentsBeforeEnd; - // Constructor. - SerializeDomParam(const WebCore::KURL& currentFrameURL, - const WebCore::TextEncoding& textEncoding, - WebCore::Document* doc, - const WebCore::String& directoryName); + SerializeDomParam(const WebCore::KURL&, const WebCore::TextEncoding&, WebCore::Document*, const WTF::String& directoryName); }; // Collect all target frames which need to be serialized. void collectTargetFrames(); // Before we begin serializing open tag of a element, we give the target // element a chance to do some work prior to add some additional data. - WebCore::String preActionBeforeSerializeOpenTag(const WebCore::Element* element, + WTF::String preActionBeforeSerializeOpenTag(const WebCore::Element* element, SerializeDomParam* param, bool* needSkip); // After we finish serializing open tag of a element, we give the target // element a chance to do some post work to add some additional data. - WebCore::String postActionAfterSerializeOpenTag(const WebCore::Element* element, + WTF::String postActionAfterSerializeOpenTag(const WebCore::Element* element, SerializeDomParam* param); // Before we begin serializing end tag of a element, we give the target // element a chance to do some work prior to add some additional data. - WebCore::String preActionBeforeSerializeEndTag(const WebCore::Element* element, + WTF::String preActionBeforeSerializeEndTag(const WebCore::Element* element, SerializeDomParam* param, bool* needSkip); // After we finish serializing end tag of a element, we give the target // element a chance to do some post work to add some additional data. - WebCore::String postActionAfterSerializeEndTag(const WebCore::Element* element, + WTF::String postActionAfterSerializeEndTag(const WebCore::Element* element, SerializeDomParam* param); // Save generated html content to data buffer. - void saveHTMLContentToBuffer(const WebCore::String& content, + void saveHTMLContentToBuffer(const WTF::String& content, SerializeDomParam* param); + + enum FlushOption { + ForceFlush, + DoNotForceFlush, + }; + // Flushes the content buffer by encoding and sending the content to the // WebPageSerializerClient. Content is not flushed if the buffer is not full // unless force is 1. void encodeAndFlushBuffer(WebPageSerializerClient::PageSerializationStatus status, SerializeDomParam* param, - bool force); + FlushOption); // Serialize open tag of an specified element. void openTagToString(const WebCore::Element* element, SerializeDomParam* param); diff --git a/WebKit/chromium/src/WebPasswordFormData.cpp b/WebKit/chromium/src/WebPasswordFormData.cpp index 64b1754..eb230d5 100644 --- a/WebKit/chromium/src/WebPasswordFormData.cpp +++ b/WebKit/chromium/src/WebPasswordFormData.cpp @@ -162,7 +162,10 @@ WebPasswordFormData::WebPasswordFormData(const WebFormElement& webForm) KURL fullOrigin(ParsedURLString, form->document()->documentURI()); // Calculate the canonical action URL - KURL fullAction = frame->loader()->completeURL(form->action()); + String action = form->action(); + if (action.isNull()) + action = ""; // missing 'action' attribute implies current URL + KURL fullAction = frame->loader()->completeURL(action); if (!fullAction.isValid()) return; diff --git a/WebKit/chromium/src/WebPasswordFormUtils.cpp b/WebKit/chromium/src/WebPasswordFormUtils.cpp index 766dc63..b4997e5 100644 --- a/WebKit/chromium/src/WebPasswordFormUtils.cpp +++ b/WebKit/chromium/src/WebPasswordFormUtils.cpp @@ -65,7 +65,7 @@ void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields) int firstPasswordIndex = 0; // First, find the password fields and activated submit button - const Vector<HTMLFormControlElement*>& formElements = form->formElements; + const Vector<HTMLFormControlElement*>& formElements = form->associatedElements(); for (size_t i = 0; i < formElements.size(); i++) { HTMLFormControlElement* formElement = formElements[i]; if (formElement->isActivatedSubmit()) @@ -79,8 +79,8 @@ void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields) continue; if ((fields->passwords.size() < maxPasswords) - && (inputElement->inputType() == HTMLInputElement::PASSWORD) - && (inputElement->autoComplete())) { + && inputElement->isPasswordField() + && inputElement->autoComplete()) { if (fields->passwords.isEmpty()) firstPasswordIndex = i; fields->passwords.append(inputElement); @@ -98,7 +98,8 @@ void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields) if (!inputElement->isEnabledFormControl()) continue; - if ((inputElement->inputType() == HTMLInputElement::TEXT) + // Various input types such as text, url, email can be a username field. + if ((inputElement->isTextField() && !inputElement->isPasswordField()) && (inputElement->autoComplete())) { fields->userName = inputElement; break; diff --git a/WebKit/chromium/src/WebPerformance.cpp b/WebKit/chromium/src/WebPerformance.cpp new file mode 100644 index 0000000..de9c1f6 --- /dev/null +++ b/WebKit/chromium/src/WebPerformance.cpp @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebPerformance.h" + +#include "Performance.h" + +using namespace WebCore; + +namespace WebKit { + +static double millisecondsToSeconds(unsigned long long milliseconds) +{ + return static_cast<double>(milliseconds / 1000.0); +} + +void WebPerformance::reset() +{ + m_private.reset(); +} + +void WebPerformance::assign(const WebPerformance& other) +{ + m_private = other.m_private; +} + +WebNavigationType WebPerformance::navigationType() const +{ + switch (m_private->navigation()->type()) { + case PerformanceNavigation::NAVIGATE: + return WebNavigationTypeOther; + case PerformanceNavigation::RELOAD: + return WebNavigationTypeReload; + case PerformanceNavigation::BACK_FORWARD: + return WebNavigationTypeBackForward; + } + ASSERT_NOT_REACHED(); + return WebNavigationTypeOther; +} + +double WebPerformance::navigationStart() const +{ + return millisecondsToSeconds(m_private->timing()->navigationStart()); +} + +double WebPerformance::unloadEventEnd() const +{ + return millisecondsToSeconds(m_private->timing()->unloadEventEnd()); +} + +double WebPerformance::redirectStart() const +{ + return millisecondsToSeconds(m_private->timing()->redirectStart()); +} + +double WebPerformance::redirectEnd() const +{ + return millisecondsToSeconds(m_private->timing()->redirectEnd()); +} + +unsigned short WebPerformance::redirectCount() const +{ + return m_private->navigation()->redirectCount(); +} + +double WebPerformance::fetchStart() const +{ + return millisecondsToSeconds(m_private->timing()->fetchStart()); +} + +double WebPerformance::domainLookupStart() const +{ + return millisecondsToSeconds(m_private->timing()->domainLookupStart()); +} + +double WebPerformance::domainLookupEnd() const +{ + return millisecondsToSeconds(m_private->timing()->domainLookupEnd()); +} + +double WebPerformance::connectStart() const +{ + return millisecondsToSeconds(m_private->timing()->connectStart()); +} + +double WebPerformance::connectEnd() const +{ + return millisecondsToSeconds(m_private->timing()->connectEnd()); +} + +double WebPerformance::requestStart() const +{ + return millisecondsToSeconds(m_private->timing()->requestStart()); +} + +double WebPerformance::responseStart() const +{ + return millisecondsToSeconds(m_private->timing()->responseStart()); +} + +double WebPerformance::responseEnd() const +{ + return millisecondsToSeconds(m_private->timing()->responseEnd()); +} + +double WebPerformance::loadEventStart() const +{ + return millisecondsToSeconds(m_private->timing()->loadEventStart()); +} + +double WebPerformance::loadEventEnd() const +{ + return millisecondsToSeconds(m_private->timing()->loadEventEnd()); +} + +WebPerformance::WebPerformance(const PassRefPtr<Performance>& performance) + : m_private(performance) +{ +} + +WebPerformance& WebPerformance::operator=(const PassRefPtr<Performance>& performance) +{ + m_private = performance; + return *this; +} + +WebPerformance::operator PassRefPtr<Performance>() const +{ + return m_private.get(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebPluginContainerImpl.cpp b/WebKit/chromium/src/WebPluginContainerImpl.cpp index 86cac26..43d9757 100644 --- a/WebKit/chromium/src/WebPluginContainerImpl.cpp +++ b/WebKit/chromium/src/WebPluginContainerImpl.cpp @@ -33,16 +33,23 @@ #include "Chrome.h" #include "ChromeClientImpl.h" +#include "PluginLayerChromium.h" +#include "WebClipboard.h" #include "WebCursorInfo.h" #include "WebDataSourceImpl.h" +#include "WebElement.h" #include "WebInputEvent.h" #include "WebInputEventConversion.h" #include "WebKit.h" +#include "WebKitClient.h" #include "WebPlugin.h" #include "WebRect.h" +#include "WebString.h" +#include "WebURL.h" #include "WebURLError.h" #include "WebURLRequest.h" #include "WebVector.h" +#include "WebViewImpl.h" #include "WrappedResourceResponse.h" #include "EventNames.h" @@ -56,10 +63,13 @@ #include "HTMLFormElement.h" #include "HTMLNames.h" #include "HTMLPlugInElement.h" +#include "KeyboardCodes.h" #include "KeyboardEvent.h" #include "MouseEvent.h" #include "Page.h" +#include "RenderBox.h" #include "ScrollView.h" +#include "WheelEvent.h" #if WEBKIT_USING_SKIA #include "PlatformContextSkia.h" @@ -124,13 +134,13 @@ void WebPluginContainerImpl::invalidateRect(const IntRect& rect) IntRect clipRect = parent()->windowClipRect(); damageRect.intersect(clipRect); - parent()->hostWindow()->repaint(damageRect, true); + parent()->hostWindow()->invalidateContentsAndWindow(damageRect, false /*immediate*/); } -void WebPluginContainerImpl::setFocus() +void WebPluginContainerImpl::setFocus(bool focused) { - Widget::setFocus(); - m_webPlugin->updateFocus(true); + Widget::setFocus(focused); + m_webPlugin->updateFocus(focused); } void WebPluginContainerImpl::show() @@ -160,8 +170,15 @@ void WebPluginContainerImpl::handleEvent(Event* event) // where mozilla behaves differently than the spec. if (event->isMouseEvent()) handleMouseEvent(static_cast<MouseEvent*>(event)); + else if (event->isWheelEvent()) + handleWheelEvent(static_cast<WheelEvent*>(event)); else if (event->isKeyboardEvent()) handleKeyboardEvent(static_cast<KeyboardEvent*>(event)); + + // FIXME: it would be cleaner if Widget::handleEvent returned true/false and + // HTMLPluginElement called setDefaultHandled or defaultEventHandler. + if (!event->defaultHandled()) + m_element->Node::defaultEventHandler(event); } void WebPluginContainerImpl::frameRectsChanged() @@ -170,6 +187,12 @@ void WebPluginContainerImpl::frameRectsChanged() reportGeometry(); } +void WebPluginContainerImpl::widgetPositionsUpdated() +{ + Widget::widgetPositionsUpdated(); + reportGeometry(); +} + void WebPluginContainerImpl::setParentVisible(bool parentVisible) { // We override this function to make sure that geometry updates are sent @@ -200,6 +223,49 @@ void WebPluginContainerImpl::setParent(ScrollView* view) reportGeometry(); } +bool WebPluginContainerImpl::supportsPaginatedPrint() const +{ + return m_webPlugin->supportsPaginatedPrint(); +} + +int WebPluginContainerImpl::printBegin(const IntRect& printableArea, + int printerDPI) const +{ + return m_webPlugin->printBegin(printableArea, printerDPI); +} + +bool WebPluginContainerImpl::printPage(int pageNumber, + WebCore::GraphicsContext* gc) +{ + gc->save(); +#if WEBKIT_USING_SKIA + WebCanvas* canvas = gc->platformContext()->canvas(); +#elif WEBKIT_USING_CG + WebCanvas* canvas = gc->platformContext(); +#endif + bool ret = m_webPlugin->printPage(pageNumber, canvas); + gc->restore(); + return ret; +} + +void WebPluginContainerImpl::printEnd() +{ + return m_webPlugin->printEnd(); +} + +void WebPluginContainerImpl::copy() +{ + if (!plugin()->hasSelection()) + return; + + webKitClient()->clipboard()->writeHTML(plugin()->selectionAsMarkup(), WebURL(), plugin()->selectionAsText(), false); +} + +WebElement WebPluginContainerImpl::element() +{ + return WebElement(m_element); +} + void WebPluginContainerImpl::invalidate() { Widget::invalidate(); @@ -210,6 +276,25 @@ void WebPluginContainerImpl::invalidateRect(const WebRect& rect) invalidateRect(static_cast<IntRect>(rect)); } +void WebPluginContainerImpl::scrollRect(int dx, int dy, const WebRect& rect) +{ + Widget* parentWidget = parent(); + if (parentWidget->isFrameView()) { + FrameView* parentFrameView = static_cast<FrameView*>(parentWidget); + if (!parentFrameView->isOverlapped()) { + IntRect damageRect = convertToContainingWindow(static_cast<IntRect>(rect)); + IntSize scrollDelta(dx, dy); + // scroll() only uses the second rectangle, clipRect, and ignores the first + // rectangle. + parent()->hostWindow()->scroll(scrollDelta, damageRect, damageRect); + return; + } + } + + // Use slow scrolling instead. + invalidateRect(rect); +} + void WebPluginContainerImpl::reportGeometry() { if (!parent()) @@ -222,6 +307,14 @@ void WebPluginContainerImpl::reportGeometry() m_webPlugin->updateGeometry(windowRect, clipRect, cutOutRects, isVisible()); } +void WebPluginContainerImpl::commitBackingTexture() +{ +#if USE(ACCELERATED_COMPOSITING) + if (platformLayer()) + platformLayer()->setNeedsDisplay(); +#endif +} + void WebPluginContainerImpl::clearScriptObjects() { Frame* frame = m_element->document()->frame(); @@ -284,6 +377,12 @@ void WebPluginContainerImpl::loadFrameRequest( SendReferrer); } +void WebPluginContainerImpl::zoomLevelChanged(double zoomLevel) +{ + WebViewImpl* view = WebViewImpl::fromPage(m_element->document()->frame()->page()); + view->fullFramePluginZoomLevelChanged(zoomLevel); +} + void WebPluginContainerImpl::didReceiveResponse(const ResourceResponse& response) { // Make sure that the plugin receives window geometry before data, or else @@ -322,8 +421,33 @@ void WebPluginContainerImpl::willDestroyPluginLoadObserver(WebPluginLoadObserver m_pluginLoadObservers.remove(pos); } +#if USE(ACCELERATED_COMPOSITING) +WebCore::LayerChromium* WebPluginContainerImpl::platformLayer() const +{ + // FIXME: In the event of a context lost, the texture needs to be recreated on the compositor's + // context and rebound to the platform layer here. + unsigned backingTextureId = m_webPlugin->getBackingTextureId(); + if (!backingTextureId) + return 0; + + m_platformLayer->setTextureId(backingTextureId); + + return m_platformLayer.get(); +} +#endif + // Private methods ------------------------------------------------------------- +WebPluginContainerImpl::WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin) + : WebCore::PluginViewBase(0) + , m_element(element) + , m_webPlugin(webPlugin) +#if USE(ACCELERATED_COMPOSITING) + , m_platformLayer(PluginLayerChromium::create(0)) +#endif +{ +} + WebPluginContainerImpl::~WebPluginContainerImpl() { for (size_t i = 0; i < m_pluginLoadObservers.size(); ++i) @@ -339,7 +463,7 @@ void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event) // in the call to HandleEvent. See http://b/issue?id=1362948 FrameView* parentView = static_cast<FrameView*>(parent()); - WebMouseEventBuilder webEvent(parentView, *event); + WebMouseEventBuilder webEvent(this, *event); if (webEvent.type == WebInputEvent::Undefined) return; @@ -353,22 +477,7 @@ void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event) } WebCursorInfo cursorInfo; - bool handled = m_webPlugin->handleInputEvent(webEvent, cursorInfo); -#if !OS(DARWIN) - // TODO(pkasting): http://b/1119691 This conditional seems exactly - // backwards, but if I reverse it, giving focus to a transparent - // (windowless) plugin fails. - handled = !handled; - // TODO(awalker): oddly, the above is not true in Mac builds. Looking - // at Apple's corresponding code for Mac and Windows (PluginViewMac and - // PluginViewWin), setDefaultHandled() gets called when handleInputEvent() - // returns true, which then indicates to WebCore that the plugin wants to - // swallow the event--which is what we want. Calling setDefaultHandled() - // fixes several Mac Chromium bugs, but does indeed prevent windowless plugins - // from getting focus in Windows builds, as pkasting notes above. So for - // now, we only do so in Mac builds. -#endif - if (handled) + if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) event->setDefaultHandled(); // A windowless plugin can change the cursor in response to a mouse move @@ -382,19 +491,48 @@ void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event) chromeClient->setCursorForPlugin(cursorInfo); } +void WebPluginContainerImpl::handleWheelEvent(WheelEvent* event) +{ + WebMouseWheelEventBuilder webEvent(this, *event); + if (webEvent.type == WebInputEvent::Undefined) + return; + + WebCursorInfo cursorInfo; + if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) + event->setDefaultHandled(); +} + void WebPluginContainerImpl::handleKeyboardEvent(KeyboardEvent* event) { WebKeyboardEventBuilder webEvent(*event); if (webEvent.type == WebInputEvent::Undefined) return; - WebCursorInfo cursor_info; - bool handled = m_webPlugin->handleInputEvent(webEvent, cursor_info); -#if !OS(DARWIN) - // TODO(pkasting): http://b/1119691 See above. - handled = !handled; + if (webEvent.type == WebInputEvent::KeyDown) { +#if defined(OS_MACOSX) + if (webEvent.modifiers == WebInputEvent::MetaKey +#else + if (webEvent.modifiers == WebInputEvent::ControlKey #endif - if (handled) + && webEvent.windowsKeyCode == VKEY_C) { + copy(); + event->setDefaultHandled(); + return; + } + } + + const WebInputEvent* currentInputEvent = WebViewImpl::currentInputEvent(); + + // Copy stashed info over, and only copy here in order not to interfere + // the ctrl-c logic above. + if (currentInputEvent + && WebInputEvent::isKeyboardEventType(currentInputEvent->type)) { + webEvent.modifiers |= currentInputEvent->modifiers & + (WebInputEvent::CapsLockOn | WebInputEvent::NumLockOn); + } + + WebCursorInfo cursorInfo; + if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) event->setDefaultHandled(); } @@ -473,11 +611,20 @@ static bool checkStackOnTop( return false; } - // For compatibility with IE: when the plugin is not positioned, - // it stacks behind the iframe, even if it's later in the - // document order. - if (ro2->style()->position() == StaticPosition) + // If the plugin does not have an explicit z-index it stacks behind the iframe. + // This is for maintaining compatibility with IE. + if (ro2->style()->position() == StaticPosition) { + // The 0'th elements of these RenderObject arrays represent the plugin node and + // the iframe. + const RenderObject* pluginRenderObject = pluginZstack[0]; + const RenderObject* iframeRenderObject = iframeZstack[0]; + + if (pluginRenderObject->style() && iframeRenderObject->style()) { + if (pluginRenderObject->style()->zIndex() > iframeRenderObject->style()->zIndex()) + return false; + } return true; + } // Inspect the document order. Later order means higher // stacking. diff --git a/WebKit/chromium/src/WebPluginContainerImpl.h b/WebKit/chromium/src/WebPluginContainerImpl.h index 00450bb..ebe6983 100644 --- a/WebKit/chromium/src/WebPluginContainerImpl.h +++ b/WebKit/chromium/src/WebPluginContainerImpl.h @@ -31,11 +31,10 @@ #ifndef WebPluginContainerImpl_h #define WebPluginContainerImpl_h -// FIXME: This relative path is a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebPluginContainer.h" - +#include "PluginViewBase.h" +#include "WebPluginContainer.h" #include "Widget.h" + #include <wtf/PassRefPtr.h> #include <wtf/Vector.h> @@ -45,9 +44,12 @@ namespace WebCore { class HTMLPlugInElement; class IntRect; class KeyboardEvent; +class LayerChromium; class MouseEvent; +class PluginLayerChromium; class ResourceError; class ResourceResponse; +class WheelEvent; } namespace WebKit { @@ -55,7 +57,7 @@ namespace WebKit { class WebPlugin; class WebPluginLoadObserver; -class WebPluginContainerImpl : public WebCore::Widget, public WebPluginContainer { +class WebPluginContainerImpl : public WebCore::PluginViewBase, public WebPluginContainer { public: static PassRefPtr<WebPluginContainerImpl> create(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin) { @@ -66,22 +68,49 @@ public: virtual void setFrameRect(const WebCore::IntRect&); virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&); virtual void invalidateRect(const WebCore::IntRect&); - virtual void setFocus(); + virtual void setFocus(bool); virtual void show(); virtual void hide(); virtual void handleEvent(WebCore::Event*); virtual void frameRectsChanged(); virtual void setParentVisible(bool); virtual void setParent(WebCore::ScrollView*); + virtual void widgetPositionsUpdated(); + virtual bool isPluginContainer() const { return true; } // WebPluginContainer methods + virtual WebElement element(); virtual void invalidate(); virtual void invalidateRect(const WebRect&); + virtual void scrollRect(int dx, int dy, const WebRect&); virtual void reportGeometry(); + virtual void commitBackingTexture(); virtual void clearScriptObjects(); virtual NPObject* scriptableObjectForElement(); virtual WebString executeScriptURL(const WebURL&, bool popupsAllowed); virtual void loadFrameRequest(const WebURLRequest&, const WebString& target, bool notifyNeeded, void* notifyData); + virtual void zoomLevelChanged(double zoomLevel); + + // This cannot be null. + WebPlugin* plugin() { return m_webPlugin; } + void setPlugin(WebPlugin* plugin) { m_webPlugin = plugin; } + + // Printing interface. The plugin can support custom printing + // (which means it controls the layout, number of pages etc). + // Whether the plugin supports its own paginated print. The other print + // interface methods are called only if this method returns true. + bool supportsPaginatedPrint() const; + // Sets up printing at the given print rect and printer DPI. printableArea + // is in points (a point is 1/72 of an inch).Returns the number of pages to + // be printed at these settings. + int printBegin(const WebCore::IntRect& printableArea, int printerDPI) const; + // Prints the page specified by pageNumber (0-based index) into the supplied canvas. + bool printPage(int pageNumber, WebCore::GraphicsContext* gc); + // Ends the print operation. + void printEnd(); + + // Copy the selected text. + void copy(); // Resource load events for the plugin's source data: void didReceiveResponse(const WebCore::ResourceResponse&); @@ -91,18 +120,18 @@ public: NPObject* scriptableObject(); - // This cannot be null. - WebPlugin* plugin() { return m_webPlugin; } - void willDestroyPluginLoadObserver(WebPluginLoadObserver*); +#if USE(ACCELERATED_COMPOSITING) + virtual WebCore::LayerChromium* platformLayer() const; +#endif + private: - WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin) - : m_element(element) - , m_webPlugin(webPlugin) { } + WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin); ~WebPluginContainerImpl(); void handleMouseEvent(WebCore::MouseEvent*); + void handleWheelEvent(WebCore::WheelEvent*); void handleKeyboardEvent(WebCore::KeyboardEvent*); void calculateGeometry(const WebCore::IntRect& frameRect, @@ -116,6 +145,10 @@ private: WebCore::HTMLPlugInElement* m_element; WebPlugin* m_webPlugin; Vector<WebPluginLoadObserver*> m_pluginLoadObservers; + +#if USE(ACCELERATED_COMPOSITING) + RefPtr<WebCore::PluginLayerChromium> m_platformLayer; +#endif }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebPluginDocument.cpp b/WebKit/chromium/src/WebPluginDocument.cpp new file mode 100644 index 0000000..8f794ad --- /dev/null +++ b/WebKit/chromium/src/WebPluginDocument.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebPluginDocument.h" + +#include "Document.h" +#include "PluginDocument.h" + +#include "WebPluginContainerImpl.h" + +#include <wtf/PassRefPtr.h> + +using namespace WebCore; + +namespace WebKit { + + +WebPlugin* WebPluginDocument::plugin() +{ + if (!isPluginDocument()) + return 0; + PluginDocument* doc = unwrap<PluginDocument>(); + WebPluginContainerImpl* container = static_cast<WebPluginContainerImpl*>(static_cast<PluginDocument*>(doc)->pluginWidget()); + return container->plugin(); +} + + +WebPluginDocument::WebPluginDocument(const PassRefPtr<PluginDocument>& elem) + : WebDocument(elem) +{ +} + +WebPluginDocument& WebPluginDocument::operator=(const PassRefPtr<PluginDocument>& elem) +{ + m_private = elem; + return *this; +} + +WebPluginDocument::operator PassRefPtr<PluginDocument>() const +{ + return static_cast<PluginDocument*>(m_private.get()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebPluginListBuilderImpl.cpp b/WebKit/chromium/src/WebPluginListBuilderImpl.cpp index 6926a2d..d0f7324 100644 --- a/WebKit/chromium/src/WebPluginListBuilderImpl.cpp +++ b/WebKit/chromium/src/WebPluginListBuilderImpl.cpp @@ -41,27 +41,25 @@ namespace WebKit { void WebPluginListBuilderImpl::addPlugin(const WebString& name, const WebString& description, const WebString& fileName) { - PluginInfo* info = new PluginInfo(); - info->name = name; - info->desc = description; - info->file = fileName; + PluginInfo info; + info.name = name; + info.desc = description; + info.file = fileName; m_results->append(info); } void WebPluginListBuilderImpl::addMediaTypeToLastPlugin(const WebString& name, const WebString& description) { - MimeClassInfo* info = new MimeClassInfo(); - info->type = name; - info->desc = description; - m_results->last()->mimes.append(info); + MimeClassInfo info; + info.type = name; + info.desc = description; + m_results->last().mimes.append(info); } void WebPluginListBuilderImpl::addFileExtensionToLastMediaType(const WebString& extension) { - MimeClassInfo* info = m_results->last()->mimes.last(); - if (!info->suffixes.isEmpty()) - info->suffixes.append(','); - info->suffixes.append(extension); + MimeClassInfo& info = m_results->last().mimes.last(); + info.extensions.append(extension); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebPluginListBuilderImpl.h b/WebKit/chromium/src/WebPluginListBuilderImpl.h index 7a8a497..3d7977a 100644 --- a/WebKit/chromium/src/WebPluginListBuilderImpl.h +++ b/WebKit/chromium/src/WebPluginListBuilderImpl.h @@ -40,7 +40,7 @@ namespace WebKit { class WebPluginListBuilderImpl : public WebPluginListBuilder { public: - WebPluginListBuilderImpl(Vector<WebCore::PluginInfo*>* results) : m_results(results) { } + WebPluginListBuilderImpl(Vector<WebCore::PluginInfo>* results) : m_results(results) { } // WebPluginListBuilder methods: virtual void addPlugin(const WebString& name, const WebString& description, const WebString& fileName); @@ -48,7 +48,7 @@ public: virtual void addFileExtensionToLastMediaType(const WebString& extension); private: - Vector<WebCore::PluginInfo*>* m_results; + Vector<WebCore::PluginInfo>* m_results; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebPluginLoadObserver.h b/WebKit/chromium/src/WebPluginLoadObserver.h index 097d08d..7bd06eb 100644 --- a/WebKit/chromium/src/WebPluginLoadObserver.h +++ b/WebKit/chromium/src/WebPluginLoadObserver.h @@ -31,7 +31,7 @@ #ifndef WebPluginLoadObserver_h #define WebPluginLoadObserver_h -#include "../public/WebURL.h" +#include "WebURL.h" namespace WebKit { diff --git a/WebKit/chromium/src/WebPopupMenuImpl.cpp b/WebKit/chromium/src/WebPopupMenuImpl.cpp index f6d360e..085a157 100644 --- a/WebKit/chromium/src/WebPopupMenuImpl.cpp +++ b/WebKit/chromium/src/WebPopupMenuImpl.cpp @@ -56,7 +56,8 @@ namespace WebKit { WebPopupMenu* WebPopupMenu::create(WebWidgetClient* client) { - return new WebPopupMenuImpl(client); + // Pass the WebPopupMenuImpl's self-reference to the caller. + return adoptRef(new WebPopupMenuImpl(client)).leakRef(); } // WebWidget ------------------------------------------------------------------ @@ -173,6 +174,16 @@ void WebPopupMenuImpl::paint(WebCanvas* canvas, const WebRect& rect) } } +void WebPopupMenuImpl::themeChanged() +{ + notImplemented(); +} + +void WebPopupMenuImpl::composite(bool finish) +{ + notImplemented(); +} + bool WebPopupMenuImpl::handleInputEvent(const WebInputEvent& inputEvent) { if (!m_widget) @@ -230,18 +241,28 @@ void WebPopupMenuImpl::setFocus(bool enable) { } -bool WebPopupMenuImpl::handleCompositionEvent( - WebCompositionCommand command, int cursorPosition, int targetStart, - int targetEnd, const WebString& imeString) +bool WebPopupMenuImpl::setComposition( + const WebString& text, const WebVector<WebCompositionUnderline>& underlines, + int selectionStart, int selectionEnd) { return false; } -bool WebPopupMenuImpl::queryCompositionStatus(bool* enabled, WebRect* caretRect) +bool WebPopupMenuImpl::confirmComposition() { return false; } +WebTextInputType WebPopupMenuImpl::textInputType() +{ + return WebTextInputTypeNone; +} + +WebRect WebPopupMenuImpl::caretOrSelectionBounds() +{ + return WebRect(); +} + void WebPopupMenuImpl::setTextDirection(WebTextDirection direction) { } @@ -250,18 +271,29 @@ void WebPopupMenuImpl::setTextDirection(WebTextDirection direction) //----------------------------------------------------------------------------- // WebCore::HostWindow -void WebPopupMenuImpl::repaint(const IntRect& paintRect, - bool contentChanged, - bool immediate, - bool repaintContentOnly) +void WebPopupMenuImpl::invalidateContents(const IntRect&, bool) { - // Ignore spurious calls. - if (!contentChanged || paintRect.isEmpty()) + notImplemented(); +} + +void WebPopupMenuImpl::invalidateWindow(const IntRect&, bool) +{ + notImplemented(); +} + +void WebPopupMenuImpl::invalidateContentsAndWindow(const IntRect& paintRect, bool /*immediate*/) +{ + if (paintRect.isEmpty()) return; if (m_client) m_client->didInvalidateRect(paintRect); } +void WebPopupMenuImpl::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate) +{ + invalidateContentsAndWindow(updateRect, immediate); +} + void WebPopupMenuImpl::scroll(const IntSize& scrollDelta, const IntRect& scrollRect, const IntRect& clipRect) @@ -296,6 +328,10 @@ void WebPopupMenuImpl::scrollbarsModeDidChange() const // Nothing to be done since we have no concept of different scrollbar modes. } +void WebPopupMenuImpl::setCursor(const WebCore::Cursor&) +{ +} + //----------------------------------------------------------------------------- // WebCore::FramelessScrollViewClient diff --git a/WebKit/chromium/src/WebPopupMenuImpl.h b/WebKit/chromium/src/WebPopupMenuImpl.h index 13eb674..221ba03 100644 --- a/WebKit/chromium/src/WebPopupMenuImpl.h +++ b/WebKit/chromium/src/WebPopupMenuImpl.h @@ -31,14 +31,10 @@ #ifndef WebPopupMenuImpl_h #define WebPopupMenuImpl_h -// FIXME: Add this to FramelessScrollViewClient.h -namespace WebCore { class FramelessScrollView; } - #include "FramelessScrollViewClient.h" -// FIXME: remove the relative paths once glue/ consumers are removed. -#include "../public/WebPoint.h" -#include "../public/WebPopupMenu.h" -#include "../public/WebSize.h" +#include "WebPoint.h" +#include "WebPopupMenu.h" +#include "WebSize.h" #include <wtf/RefCounted.h> namespace WebCore { @@ -67,14 +63,20 @@ public: virtual void resize(const WebSize&); virtual void layout(); virtual void paint(WebCanvas* canvas, const WebRect& rect); + virtual void themeChanged(); + virtual void composite(bool finish); virtual bool handleInputEvent(const WebInputEvent&); virtual void mouseCaptureLost(); virtual void setFocus(bool enable); - virtual bool handleCompositionEvent( - WebCompositionCommand command, int cursorPosition, - int targetStart, int targetEnd, const WebString& text); - virtual bool queryCompositionStatus(bool* enabled, WebRect* caretRect); + virtual bool setComposition( + const WebString& text, + const WebVector<WebCompositionUnderline>& underlines, + int selectionStart, int selectionEnd); + virtual bool confirmComposition(); + virtual WebTextInputType textInputType(); + virtual WebRect caretOrSelectionBounds(); virtual void setTextDirection(WebTextDirection direction); + virtual bool isAcceleratedCompositingActive() const { return false; } // WebPopupMenuImpl void Init(WebCore::FramelessScrollView* widget, @@ -98,9 +100,10 @@ public: ~WebPopupMenuImpl(); // WebCore::HostWindow methods: - virtual void repaint( - const WebCore::IntRect&, bool contentChanged, bool immediate = false, - bool repaintContentOnly = false); + virtual void invalidateContents(const WebCore::IntRect&, bool); + virtual void invalidateWindow(const WebCore::IntRect&, bool); + virtual void invalidateContentsAndWindow(const WebCore::IntRect&, bool); + virtual void invalidateContentsForSlowScroll(const WebCore::IntRect&, bool); virtual void scroll( const WebCore::IntSize& scrollDelta, const WebCore::IntRect& scrollRect, const WebCore::IntRect& clipRect); @@ -109,6 +112,7 @@ public: virtual PlatformPageClient platformPageClient() const { return 0; } virtual void scrollRectIntoView(const WebCore::IntRect&, const WebCore::ScrollView*) const; virtual void scrollbarsModeDidChange() const; + virtual void setCursor(const WebCore::Cursor&); // WebCore::FramelessScrollViewClient methods: virtual void popupClosed(WebCore::FramelessScrollView*); diff --git a/WebKit/chromium/src/WebRuntimeFeatures.cpp b/WebKit/chromium/src/WebRuntimeFeatures.cpp index ad84764..edb0413 100644 --- a/WebKit/chromium/src/WebRuntimeFeatures.cpp +++ b/WebKit/chromium/src/WebRuntimeFeatures.cpp @@ -31,7 +31,7 @@ #include "config.h" #include "WebRuntimeFeatures.h" -#include "Database.h" +#include "AbstractDatabase.h" #include "RuntimeEnabledFeatures.h" #include "WebMediaPlayerClientImpl.h" #include "WebSocket.h" @@ -43,14 +43,14 @@ namespace WebKit { void WebRuntimeFeatures::enableDatabase(bool enable) { #if ENABLE(DATABASE) - Database::setIsAvailable(enable); + AbstractDatabase::setIsAvailable(enable); #endif } bool WebRuntimeFeatures::isDatabaseEnabled() { #if ENABLE(DATABASE) - return Database::isAvailable(); + return AbstractDatabase::isAvailable(); #else return false; #endif @@ -171,14 +171,118 @@ bool WebRuntimeFeatures::isGeolocationEnabled() void WebRuntimeFeatures::enableIndexedDatabase(bool enable) { #if ENABLE(INDEXED_DATABASE) - RuntimeEnabledFeatures::setIndexedDBEnabled(enable); + RuntimeEnabledFeatures::setWebkitIndexedDBEnabled(enable); #endif } bool WebRuntimeFeatures::isIndexedDatabaseEnabled() { #if ENABLE(INDEXED_DATABASE) - return RuntimeEnabledFeatures::indexedDBEnabled(); + return RuntimeEnabledFeatures::webkitIndexedDBEnabled(); +#else + return false; +#endif +} + +void WebRuntimeFeatures::enableWebGL(bool enable) +{ +#if ENABLE(3D_CANVAS) + RuntimeEnabledFeatures::setWebGLEnabled(enable); +#endif +} + +bool WebRuntimeFeatures::isWebGLEnabled() +{ +#if ENABLE(3D_CANVAS) + return RuntimeEnabledFeatures::webGLRenderingContextEnabled(); +#else + return false; +#endif +} + +void WebRuntimeFeatures::enablePushState(bool enable) +{ + RuntimeEnabledFeatures::setPushStateEnabled(enable); +} + +bool WebRuntimeFeatures::isPushStateEnabled(bool enable) +{ + return RuntimeEnabledFeatures::pushStateEnabled(); +} + +void WebRuntimeFeatures::enableTouch(bool enable) +{ +#if ENABLE(TOUCH_EVENTS) + RuntimeEnabledFeatures::setTouchEnabled(enable); +#endif +} + +bool WebRuntimeFeatures::isTouchEnabled() +{ +#if ENABLE(TOUCH_EVENTS) + return RuntimeEnabledFeatures::touchEnabled(); +#else + return false; +#endif +} + +void WebRuntimeFeatures::enableDeviceMotion(bool enable) +{ + RuntimeEnabledFeatures::setDeviceMotionEnabled(enable); +} + +bool WebRuntimeFeatures::isDeviceMotionEnabled() +{ + return RuntimeEnabledFeatures::deviceMotionEnabled(); +} + +void WebRuntimeFeatures::enableDeviceOrientation(bool enable) +{ + RuntimeEnabledFeatures::setDeviceOrientationEnabled(enable); +} + +bool WebRuntimeFeatures::isDeviceOrientationEnabled() +{ + return RuntimeEnabledFeatures::deviceOrientationEnabled(); +} + +void WebRuntimeFeatures::enableSpeechInput(bool enable) +{ + RuntimeEnabledFeatures::setSpeechInputEnabled(enable); +} + +bool WebRuntimeFeatures::isSpeechInputEnabled() +{ + return RuntimeEnabledFeatures::speechInputEnabled(); +} + +void WebRuntimeFeatures::enableXHRResponseBlob(bool enable) +{ +#if ENABLE(XHR_RESPONSE_BLOB) + RuntimeEnabledFeatures::setXHRResponseBlobEnabled(enable); +#endif +} + +bool WebRuntimeFeatures::isXHRResponseBlobEnabled() +{ +#if ENABLE(XHR_RESPONSE_BLOB) + return RuntimeEnabledFeatures::xhrResponseBlobEnabled(); +#else + return false; +#endif +} + +void WebRuntimeFeatures::enableFileSystem(bool enable) +{ +#if ENABLE(FILE_SYSTEM) + RuntimeEnabledFeatures::setFileSystemEnabled(enable); +#endif +} + +bool WebRuntimeFeatures::isFileSystemEnabled() +{ +#if ENABLE(FILE_SYSTEM) + return RuntimeEnabledFeatures::fileSystemEnabled(); #else return false; #endif diff --git a/WebKit/chromium/src/WebScriptController.cpp b/WebKit/chromium/src/WebScriptController.cpp index d2c168d..0aa11a6 100644 --- a/WebKit/chromium/src/WebScriptController.cpp +++ b/WebKit/chromium/src/WebScriptController.cpp @@ -43,19 +43,7 @@ namespace WebKit { void WebScriptController::registerExtension(v8::Extension* extension) { - V8Proxy::registerExtension(extension, WebString()); -} - -void WebScriptController::registerExtension(v8::Extension* extension, - const WebString& schemeRestriction) -{ - V8Proxy::registerExtension(extension, schemeRestriction); -} - -void WebScriptController::registerExtension(v8::Extension* extension, - int extensionGroup) -{ - V8Proxy::registerExtension(extension, extensionGroup); + V8Proxy::registerExtension(extension); } void WebScriptController::enableV8SingleThreadMode() diff --git a/WebKit/chromium/src/WebScrollbarImpl.cpp b/WebKit/chromium/src/WebScrollbarImpl.cpp new file mode 100644 index 0000000..8b9e287 --- /dev/null +++ b/WebKit/chromium/src/WebScrollbarImpl.cpp @@ -0,0 +1,307 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebScrollbarImpl.h" + +#include "GraphicsContext.h" +#include "KeyboardCodes.h" +#include "PlatformContextSkia.h" +#include "Scrollbar.h" +#include "ScrollbarTheme.h" +#include "ScrollTypes.h" +#include "WebCanvas.h" +#include "WebInputEvent.h" +#include "WebInputEventConversion.h" +#include "WebRect.h" +#include "WebScrollbarClient.h" +#include "WebVector.h" +#include "WebViewImpl.h" + +using namespace std; +using namespace WebCore; + +namespace WebKit { + +WebScrollbar* WebScrollbar::create(WebScrollbarClient* client, Orientation orientation) +{ + return new WebScrollbarImpl(client, orientation); +} + +int WebScrollbar::defaultThickness() +{ + return ScrollbarTheme::nativeTheme()->scrollbarThickness(); +} + +WebScrollbarImpl::WebScrollbarImpl(WebScrollbarClient* client, Orientation orientation) + : m_client(client) +{ + m_scrollbar = Scrollbar::createNativeScrollbar( + static_cast<ScrollbarClient*>(this), + static_cast<ScrollbarOrientation>(orientation), + RegularScrollbar); +} + +WebScrollbarImpl::~WebScrollbarImpl() +{ +} + +void WebScrollbarImpl::setLocation(const WebRect& rect) +{ + WebCore::IntRect oldRect = m_scrollbar->frameRect(); + m_scrollbar->setFrameRect(rect); + if (WebRect(oldRect) != rect) + m_scrollbar->invalidate(); + + int length = m_scrollbar->orientation() == HorizontalScrollbar ? m_scrollbar->width() : m_scrollbar->height(); + int pageStep = max(max(static_cast<int>(static_cast<float>(length) * Scrollbar::minFractionToStepWhenPaging()), length - Scrollbar::maxOverlapBetweenPages()), 1); + m_scrollbar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep); + m_scrollbar->setEnabled(m_scrollbar->totalSize() > length); + m_scrollbar->setProportion(length, m_scrollbar->totalSize()); +} + +int WebScrollbarImpl::value() const +{ + return m_scrollbar->value(); +} + +void WebScrollbarImpl::setValue(int position) +{ + m_scrollbar->setValue(position, Scrollbar::NotFromScrollAnimator); +} + +void WebScrollbarImpl::setDocumentSize(int size) +{ + int length = m_scrollbar->orientation() == HorizontalScrollbar ? m_scrollbar->width() : m_scrollbar->height(); + m_scrollbar->setEnabled(size > length); + m_scrollbar->setProportion(length, size); +} + +void WebScrollbarImpl::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier) +{ + WebCore::ScrollDirection dir; + bool horizontal = m_scrollbar->orientation() == HorizontalScrollbar; + if (direction == ScrollForward) + dir = horizontal ? ScrollRight : ScrollDown; + else + dir = horizontal ? ScrollLeft : ScrollUp; + m_scrollbar->scroll(dir, static_cast<WebCore::ScrollGranularity>(granularity), multiplier); +} + +void WebScrollbarImpl::paint(WebCanvas* canvas, const WebRect& rect) +{ +#if WEBKIT_USING_CG + GraphicsContext gc(canvas); +#elif WEBKIT_USING_SKIA + PlatformContextSkia context(canvas); + + // PlatformGraphicsContext is actually a pointer to PlatformContextSkia + GraphicsContext gc(reinterpret_cast<PlatformGraphicsContext*>(&context)); +#else + notImplemented(); +#endif + + m_scrollbar->paint(&gc, rect); +} + +bool WebScrollbarImpl::handleInputEvent(const WebInputEvent& event) +{ + switch (event.type) { + case WebInputEvent::MouseDown: + return onMouseDown(event); + case WebInputEvent::MouseUp: + return onMouseUp(event); + case WebInputEvent::MouseMove: + return onMouseMove(event); + case WebInputEvent::MouseLeave: + return onMouseLeave(event); + case WebInputEvent::MouseWheel: + return onMouseWheel(event); + case WebInputEvent::KeyDown: + return onKeyDown(event); + case WebInputEvent::Undefined: + case WebInputEvent::MouseEnter: + case WebInputEvent::RawKeyDown: + case WebInputEvent::KeyUp: + case WebInputEvent::Char: + case WebInputEvent::TouchStart: + case WebInputEvent::TouchMove: + case WebInputEvent::TouchEnd: + case WebInputEvent::TouchCancel: + default: + break; + } + return false; +} + +bool WebScrollbarImpl::onMouseDown(const WebInputEvent& event) +{ + WebMouseEvent mousedown = *static_cast<const WebMouseEvent*>(&event); + if (!m_scrollbar->frameRect().contains(mousedown.x, mousedown.y)) + return false; + + mousedown.x -= m_scrollbar->x(); + mousedown.y -= m_scrollbar->y(); + m_scrollbar->mouseDown(PlatformMouseEventBuilder(m_scrollbar.get(), mousedown)); + return true; + } + +bool WebScrollbarImpl::onMouseUp(const WebInputEvent& event) +{ + if (m_scrollbar->pressedPart() == NoPart) + return false; + + return m_scrollbar->mouseUp(); +} + +bool WebScrollbarImpl::onMouseMove(const WebInputEvent& event) +{ + WebMouseEvent mousemove = *static_cast<const WebMouseEvent*>(&event); + if (m_scrollbar->frameRect().contains(mousemove.x, mousemove.y) + || m_scrollbar->pressedPart() != NoPart) { + mousemove.x -= m_scrollbar->x(); + mousemove.y -= m_scrollbar->y(); + return m_scrollbar->mouseMoved(PlatformMouseEventBuilder(m_scrollbar.get(), mousemove)); + } + + if (m_scrollbar->hoveredPart() != NoPart) + m_scrollbar->mouseExited(); + return false; +} + +bool WebScrollbarImpl::onMouseLeave(const WebInputEvent& event) +{ + if (m_scrollbar->hoveredPart() == NoPart) + return false; + + return m_scrollbar->mouseExited(); +} + +bool WebScrollbarImpl::onMouseWheel(const WebInputEvent& event) +{ + // Same logic as in Scrollview.cpp. If we can move at all, we'll accept the event. + WebMouseWheelEvent mousewheel = *static_cast<const WebMouseWheelEvent*>(&event); + int maxScrollDelta = m_scrollbar->maximum() - m_scrollbar->value(); + float delta = m_scrollbar->orientation() == HorizontalScrollbar ? mousewheel.deltaX : mousewheel.deltaY; + if ((delta < 0 && maxScrollDelta > 0) || (delta > 0 && m_scrollbar->value() > 0)) { + if (mousewheel.scrollByPage) { + ASSERT(m_scrollbar->orientation() == VerticalScrollbar); + bool negative = delta < 0; + delta = max(max(static_cast<float>(m_scrollbar->visibleSize()) * Scrollbar::minFractionToStepWhenPaging(), static_cast<float>(m_scrollbar->visibleSize() - Scrollbar::maxOverlapBetweenPages())), 1.0f); + if (negative) + delta *= -1; + } + m_scrollbar->scroll((m_scrollbar->orientation() == HorizontalScrollbar) ? WebCore::ScrollLeft : WebCore::ScrollUp, WebCore::ScrollByPixel, delta); + return true; + } + + return false; + } + +bool WebScrollbarImpl::onKeyDown(const WebInputEvent& event) +{ + WebKeyboardEvent keyboard = *static_cast<const WebKeyboardEvent*>(&event); + int keyCode; + // We have to duplicate this logic from WebViewImpl because there it uses + // Char and RawKeyDown events, which don't exist at this point. + if (keyboard.windowsKeyCode == VKEY_SPACE) + keyCode = ((keyboard.modifiers & WebInputEvent::ShiftKey) ? VKEY_PRIOR : VKEY_NEXT); + else { + if (keyboard.modifiers == WebInputEvent::ControlKey) { + // Match FF behavior in the sense that Ctrl+home/end are the only Ctrl + // key combinations which affect scrolling. Safari is buggy in the + // sense that it scrolls the page for all Ctrl+scrolling key + // combinations. For e.g. Ctrl+pgup/pgdn/up/down, etc. + switch (keyboard.windowsKeyCode) { + case VKEY_HOME: + case VKEY_END: + break; + default: + return false; + } + } + + if (keyboard.isSystemKey || (keyboard.modifiers & WebInputEvent::ShiftKey)) + return false; + + keyCode = keyboard.windowsKeyCode; + } + WebCore::ScrollDirection scrollDirection; + WebCore::ScrollGranularity scrollGranularity; + if (WebViewImpl::mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity)) { + // Will return false if scroll direction wasn't compatible with this scrollbar. + return m_scrollbar->scroll(scrollDirection, scrollGranularity); + } + return false; +} + +int WebScrollbarImpl::scrollSize(WebCore::ScrollbarOrientation orientation) const +{ + return (orientation == m_scrollbar->orientation()) ? (m_scrollbar->totalSize() - m_scrollbar->visibleSize()) : 0; +} + +void WebScrollbarImpl::setScrollOffsetFromAnimation(const WebCore::IntPoint& offset) +{ + m_scrollbar->setValue((m_scrollbar->orientation() == HorizontalScrollbar) ? offset.x() : offset.y(), Scrollbar::FromScrollAnimator); +} + +void WebScrollbarImpl::valueChanged(WebCore::Scrollbar*) +{ + m_client->valueChanged(this); +} + +void WebScrollbarImpl::invalidateScrollbarRect(WebCore::Scrollbar*, const WebCore::IntRect& rect) +{ + WebRect webrect(rect); + webrect.x += m_scrollbar->x(); + webrect.y += m_scrollbar->y(); + m_client->invalidateScrollbarRect(this, webrect); +} + +bool WebScrollbarImpl::isActive() const +{ + return true; +} + +bool WebScrollbarImpl::scrollbarCornerPresent() const +{ + return false; +} + +void WebScrollbarImpl::getTickmarks(Vector<WebCore::IntRect>& tickmarks) const +{ + WebVector<WebRect> ticks; + m_client->getTickmarks(const_cast<WebScrollbarImpl*>(this), &ticks); + tickmarks.resize(ticks.size()); + for (size_t i = 0; i < ticks.size(); ++i) + tickmarks[i] = ticks[i]; +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebScrollbarImpl.h b/WebKit/chromium/src/WebScrollbarImpl.h new file mode 100644 index 0000000..5512867 --- /dev/null +++ b/WebKit/chromium/src/WebScrollbarImpl.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WebScrollbarImpl_h +#define WebScrollbarImpl_h + +#include "ScrollbarClient.h" +#include "WebScrollbar.h" + +#include <wtf/RefPtr.h> + +namespace WebCore { +class Scrollbar; +} + +namespace WebKit { + +class WebScrollbarImpl : public WebScrollbar, + public WebCore::ScrollbarClient { +public: + WebScrollbarImpl(WebScrollbarClient*, Orientation orientation); + ~WebScrollbarImpl(); + + // WebKit::WebScrollbar methods + virtual void setLocation(const WebRect&); + virtual int value() const; + virtual void setValue(int position); + virtual void setDocumentSize(int size); + virtual void scroll(ScrollDirection, ScrollGranularity, float multiplier); + virtual void paint(WebCanvas*, const WebRect&); + virtual bool handleInputEvent(const WebInputEvent&); + + // WebCore::ScrollbarClient methods + virtual int scrollSize(WebCore::ScrollbarOrientation orientation) const; + virtual void setScrollOffsetFromAnimation(const WebCore::IntPoint&); + virtual void valueChanged(WebCore::Scrollbar*); + virtual void invalidateScrollbarRect(WebCore::Scrollbar*, const WebCore::IntRect&); + virtual bool isActive() const; + virtual bool scrollbarCornerPresent() const; + virtual void getTickmarks(Vector<WebCore::IntRect>&) const; + +private: + bool onMouseDown(const WebInputEvent& event); + bool onMouseUp(const WebInputEvent& event); + bool onMouseMove(const WebInputEvent& event); + bool onMouseLeave(const WebInputEvent& event); + bool onMouseWheel(const WebInputEvent& event); + bool onKeyDown(const WebInputEvent& event); + + WebScrollbarClient* m_client; + + RefPtr<WebCore::Scrollbar> m_scrollbar; +}; + +} // namespace WebKit + +#endif diff --git a/WebKit/chromium/src/WebSearchableFormData.cpp b/WebKit/chromium/src/WebSearchableFormData.cpp index eddaffe..50192eb 100644 --- a/WebKit/chromium/src/WebSearchableFormData.cpp +++ b/WebKit/chromium/src/WebSearchableFormData.cpp @@ -62,7 +62,7 @@ void GetFormEncoding(const HTMLFormElement* form, TextEncoding* encoding) return; } const Frame* frame = form->document()->frame(); - *encoding = frame ? TextEncoding(frame->loader()->encoding()) : Latin1Encoding(); + *encoding = frame ? TextEncoding(frame->loader()->writer()->encoding()) : Latin1Encoding(); } // Returns true if the submit request results in an HTTP URL. @@ -77,7 +77,8 @@ bool IsHTTPFormSubmit(const HTMLFormElement* form) HTMLFormControlElement* GetButtonToActivate(HTMLFormElement* form) { HTMLFormControlElement* firstSubmitButton = 0; - for (Vector<HTMLFormControlElement*>::const_iterator i(form->formElements.begin()); i != form->formElements.end(); ++i) { + // FIXME: Consider refactoring this code so that we don't call form->associatedElements() twice. + for (Vector<HTMLFormControlElement*>::const_iterator i(form->associatedElements().begin()); i != form->associatedElements().end(); ++i) { HTMLFormControlElement* formElement = *i; if (formElement->isActivatedSubmit()) // There's a button that is already activated for submit, return 0. @@ -130,7 +131,7 @@ bool IsInDefaultState(const HTMLFormControlElement* formElement) { if (formElement->hasTagName(HTMLNames::inputTag)) { const HTMLInputElement* inputElement = static_cast<const HTMLInputElement*>(formElement); - if (inputElement->inputType() == HTMLInputElement::CHECKBOX || inputElement->inputType() == HTMLInputElement::RADIO) + if (inputElement->isCheckbox() || inputElement->isRadioButton()) return inputElement->checked() == inputElement->defaultChecked(); } else if (formElement->hasTagName(HTMLNames::selectTag)) return IsSelectInDefaultState(static_cast<const HTMLSelectElement*>(formElement)); @@ -154,7 +155,8 @@ bool HasSuitableTextElement(const HTMLFormElement* form, Vector<char>* encodedSt *encodingName = encoding.name(); HTMLInputElement* textElement = 0; - for (Vector<HTMLFormControlElement*>::const_iterator i(form->formElements.begin()); i != form->formElements.end(); ++i) { + // FIXME: Consider refactoring this code so that we don't call form->associatedElements() twice. + for (Vector<HTMLFormControlElement*>::const_iterator i(form->associatedElements().begin()); i != form->associatedElements().end(); ++i) { HTMLFormControlElement* formElement = *i; if (formElement->disabled() || formElement->name().isNull()) continue; @@ -164,29 +166,27 @@ bool HasSuitableTextElement(const HTMLFormElement* form, Vector<char>* encodedSt bool isTextElement = false; if (formElement->hasTagName(HTMLNames::inputTag)) { - switch (static_cast<const HTMLInputElement*>(formElement)->inputType()) { - case HTMLInputElement::TEXT: - case HTMLInputElement::ISINDEX: - isTextElement = true; - break; - case HTMLInputElement::PASSWORD: - // Don't store passwords! This is most likely an https anyway. - // Fall through. - case HTMLInputElement::FILE: + const HTMLInputElement* input = static_cast<const HTMLInputElement*>(formElement); + if (input->isFileUpload()) { // Too big, don't try to index this. return 0; - default: - // All other input types are indexable. - break; } + + if (input->isPasswordField()) { + // Don't store passwords! This is most likely an https anyway. + return 0; + } + + if (input->isTextField()) + isTextElement = true; } FormDataList dataList(encoding); if (!formElement->appendFormData(dataList, false)) continue; - const Vector<FormDataList::Item>& itemList = dataList.list(); - if (isTextElement && !itemList.isEmpty()) { + const Vector<FormDataList::Item>& items = dataList.items(); + if (isTextElement && !items.isEmpty()) { if (textElement) { // The auto-complete bar only knows how to fill in one value. // This form has multiple fields; don't treat it as searchable. @@ -194,7 +194,7 @@ bool HasSuitableTextElement(const HTMLFormElement* form, Vector<char>* encodedSt } textElement = static_cast<HTMLInputElement*>(formElement); } - for (Vector<FormDataList::Item>::const_iterator j(itemList.begin()); j != itemList.end(); ++j) { + for (Vector<FormDataList::Item>::const_iterator j(items.begin()); j != items.end(); ++j) { // Handle ISINDEX / <input name=isindex> specially, but only if it's // the first entry. if (!encodedString->isEmpty() || j->data() != "isindex") { diff --git a/WebKit/chromium/src/WebSecurityOrigin.cpp b/WebKit/chromium/src/WebSecurityOrigin.cpp index 81546da..adccb31 100644 --- a/WebKit/chromium/src/WebSecurityOrigin.cpp +++ b/WebKit/chromium/src/WebSecurityOrigin.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2010 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -31,8 +31,10 @@ #include "config.h" #include "WebSecurityOrigin.h" +#include "KURL.h" #include "SecurityOrigin.h" #include "WebString.h" +#include "WebURL.h" #include <wtf/PassRefPtr.h> using namespace WebCore; @@ -42,9 +44,9 @@ namespace WebKit { class WebSecurityOriginPrivate : public SecurityOrigin { }; -WebSecurityOrigin* WebSecurityOrigin::createFromDatabaseIdentifier(const WebString& databaseIdentifier) +WebSecurityOrigin WebSecurityOrigin::createFromDatabaseIdentifier(const WebString& databaseIdentifier) { - return new WebSecurityOrigin(SecurityOrigin::createFromDatabaseIdentifier(databaseIdentifier)); + return WebSecurityOrigin(SecurityOrigin::createFromDatabaseIdentifier(databaseIdentifier)); } WebSecurityOrigin WebSecurityOrigin::createFromString(const WebString& origin) @@ -52,6 +54,11 @@ WebSecurityOrigin WebSecurityOrigin::createFromString(const WebString& origin) return WebSecurityOrigin(SecurityOrigin::createFromString(origin)); } +WebSecurityOrigin WebSecurityOrigin::create(const WebURL& url) +{ + return WebSecurityOrigin(SecurityOrigin::create(url)); +} + void WebSecurityOrigin::reset() { assign(0); @@ -89,18 +96,37 @@ bool WebSecurityOrigin::isEmpty() const return m_private->isEmpty(); } +bool WebSecurityOrigin::canAccess(const WebSecurityOrigin& other) const +{ + ASSERT(m_private); + ASSERT(other.m_private); + return m_private->canAccess(other.m_private); +} + +bool WebSecurityOrigin::canRequest(const WebURL& url) const +{ + ASSERT(m_private); + return m_private->canRequest(url); +} + WebString WebSecurityOrigin::toString() const { ASSERT(m_private); return m_private->toString(); } -WebString WebSecurityOrigin::databaseIdentifier() +WebString WebSecurityOrigin::databaseIdentifier() const { ASSERT(m_private); return m_private->databaseIdentifier(); } +bool WebSecurityOrigin::canAccessPasswordManager() const +{ + ASSERT(m_private); + return m_private->canAccessPasswordManager(); +} + WebSecurityOrigin::WebSecurityOrigin(const WTF::PassRefPtr<WebCore::SecurityOrigin>& origin) : m_private(static_cast<WebSecurityOriginPrivate*>(origin.releaseRef())) { @@ -117,6 +143,11 @@ WebSecurityOrigin::operator WTF::PassRefPtr<WebCore::SecurityOrigin>() const return PassRefPtr<SecurityOrigin>(const_cast<WebSecurityOriginPrivate*>(m_private)); } +SecurityOrigin* WebSecurityOrigin::get() const +{ + return m_private; +} + void WebSecurityOrigin::assign(WebSecurityOriginPrivate* p) { // p is already ref'd for us by the caller diff --git a/WebKit/chromium/src/WebSecurityPolicy.cpp b/WebKit/chromium/src/WebSecurityPolicy.cpp index 48b445c..58d0893 100644 --- a/WebKit/chromium/src/WebSecurityPolicy.cpp +++ b/WebKit/chromium/src/WebSecurityPolicy.cpp @@ -32,6 +32,7 @@ #include "WebSecurityPolicy.h" #include "FrameLoader.h" +#include "SchemeRegistry.h" #include "SecurityOrigin.h" #include "WebString.h" @@ -43,27 +44,44 @@ namespace WebKit { void WebSecurityPolicy::registerURLSchemeAsLocal(const WebString& scheme) { - SecurityOrigin::registerURLSchemeAsLocal(scheme); + SchemeRegistry::registerURLSchemeAsLocal(scheme); } void WebSecurityPolicy::registerURLSchemeAsNoAccess(const WebString& scheme) { - SecurityOrigin::registerURLSchemeAsNoAccess(scheme); + SchemeRegistry::registerURLSchemeAsNoAccess(scheme); } -void WebSecurityPolicy::whiteListAccessFromOrigin(const WebURL& sourceOrigin, +void WebSecurityPolicy::registerURLSchemeAsSecure(const WebString& scheme) +{ + SchemeRegistry::registerURLSchemeAsSecure(scheme); +} + +void WebSecurityPolicy::addOriginAccessWhitelistEntry( + const WebURL& sourceOrigin, + const WebString& destinationProtocol, + const WebString& destinationHost, + bool allowDestinationSubdomains) +{ + SecurityOrigin::addOriginAccessWhitelistEntry( + *SecurityOrigin::create(sourceOrigin), destinationProtocol, + destinationHost, allowDestinationSubdomains); +} + +void WebSecurityPolicy::removeOriginAccessWhitelistEntry( + const WebURL& sourceOrigin, const WebString& destinationProtocol, const WebString& destinationHost, bool allowDestinationSubdomains) { - SecurityOrigin::whiteListAccessFromOrigin( + SecurityOrigin::removeOriginAccessWhitelistEntry( *SecurityOrigin::create(sourceOrigin), destinationProtocol, destinationHost, allowDestinationSubdomains); } -void WebSecurityPolicy::resetOriginAccessWhiteLists() +void WebSecurityPolicy::resetOriginAccessWhitelists() { - SecurityOrigin::resetOriginAccessWhiteLists(); + SecurityOrigin::resetOriginAccessWhitelists(); } bool WebSecurityPolicy::shouldHideReferrer(const WebURL& url, const WebString& referrer) diff --git a/WebKit/chromium/src/WebSelectElement.cpp b/WebKit/chromium/src/WebSelectElement.cpp new file mode 100644 index 0000000..79a4d85 --- /dev/null +++ b/WebKit/chromium/src/WebSelectElement.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebSelectElement.h" + +#include "HTMLNames.h" +#include "HTMLOptionElement.h" +#include "HTMLSelectElement.h" +#include "WebString.h" +#include <wtf/PassRefPtr.h> + +using namespace WebCore; + +namespace WebKit { + +void WebSelectElement::setValue(const WebString& value) +{ + unwrap<HTMLSelectElement>()->setValue(value); +} + +WebString WebSelectElement::value() +{ + return unwrap<HTMLSelectElement>()->value(); +} + +WebVector<WebElement> WebSelectElement::listItems() +{ + const Vector<Element*>& sourceItems = unwrap<HTMLSelectElement>()->listItems(); + WebVector<WebElement> items(sourceItems.size()); + for (size_t i = 0; i < sourceItems.size(); ++i) + items[i] = WebElement(static_cast<HTMLElement*>(sourceItems[i])); + + return items; +} + +WebSelectElement::WebSelectElement(const PassRefPtr<HTMLSelectElement>& elem) + : WebFormControlElement(elem) +{ +} + +WebSelectElement& WebSelectElement::operator=(const PassRefPtr<HTMLSelectElement>& elem) +{ + m_private = elem; + return *this; +} + +WebSelectElement::operator PassRefPtr<HTMLSelectElement>() const +{ + return static_cast<HTMLSelectElement*>(m_private.get()); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebSerializedScriptValue.cpp b/WebKit/chromium/src/WebSerializedScriptValue.cpp new file mode 100644 index 0000000..7149a4d --- /dev/null +++ b/WebKit/chromium/src/WebSerializedScriptValue.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebSerializedScriptValue.h" + +#include "SerializedScriptValue.h" +#include "WebString.h" + +using namespace WebCore; + +namespace WebKit { + +WebSerializedScriptValue WebSerializedScriptValue::fromString(const WebString& s) +{ + return SerializedScriptValue::createFromWire(s); +} + +WebSerializedScriptValue WebSerializedScriptValue::createInvalid() +{ + return SerializedScriptValue::create(); +} + +void WebSerializedScriptValue::reset() +{ + m_private.reset(); +} + +void WebSerializedScriptValue::assign(const WebSerializedScriptValue& other) +{ + m_private = other.m_private; +} + +WebString WebSerializedScriptValue::toString() const +{ + return m_private->toWireString(); +} + +WebSerializedScriptValue::WebSerializedScriptValue(const PassRefPtr<SerializedScriptValue>& value) + : m_private(value) +{ +} + +WebSerializedScriptValue& WebSerializedScriptValue::operator=(const PassRefPtr<SerializedScriptValue>& value) +{ + m_private = value; + return *this; +} + +WebSerializedScriptValue::operator PassRefPtr<SerializedScriptValue>() const +{ + return m_private.get(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebSettingsImpl.cpp b/WebKit/chromium/src/WebSettingsImpl.cpp index 5cfbd4f..e60562c 100644 --- a/WebKit/chromium/src/WebSettingsImpl.cpp +++ b/WebKit/chromium/src/WebSettingsImpl.cpp @@ -185,6 +185,11 @@ void WebSettingsImpl::setUserStyleSheetLocation(const WebURL& location) m_settings->setUserStyleSheetLocation(location); } +void WebSettingsImpl::setAuthorAndUserStylesEnabled(bool enabled) +{ + m_settings->setAuthorAndUserStylesEnabled(enabled); +} + void WebSettingsImpl::setUsesPageCache(bool usesPageCache) { m_settings->setUsesPageCache(usesPageCache); @@ -195,6 +200,11 @@ void WebSettingsImpl::setDownloadableBinaryFontsEnabled(bool enabled) m_settings->setDownloadableBinaryFontsEnabled(enabled); } +void WebSettingsImpl::setJavaScriptCanAccessClipboard(bool enabled) +{ + m_settings->setJavaScriptCanAccessClipboard(enabled); +} + void WebSettingsImpl::setXSSAuditorEnabled(bool enabled) { m_settings->setXSSAuditorEnabled(enabled); @@ -213,6 +223,11 @@ void WebSettingsImpl::setEditableLinkBehaviorNeverLive() m_settings->setEditableLinkBehavior(WebCore::EditableLinkNeverLive); } +void WebSettingsImpl::setFrameFlatteningEnabled(bool enabled) +{ + m_settings->setFrameFlatteningEnabled(enabled); +} + void WebSettingsImpl::setFontRenderingModeNormal() { // FIXME: If you ever need more behaviors than this, then we should probably @@ -226,14 +241,14 @@ void WebSettingsImpl::setShouldPaintCustomScrollbars(bool enabled) m_settings->setShouldPaintCustomScrollbars(enabled); } -void WebSettingsImpl::setDatabasesEnabled(bool enabled) +void WebSettingsImpl::setAllowUniversalAccessFromFileURLs(bool allow) { - m_settings->setDatabasesEnabled(enabled); + m_settings->setAllowUniversalAccessFromFileURLs(allow); } -void WebSettingsImpl::setAllowUniversalAccessFromFileURLs(bool allow) +void WebSettingsImpl::setAllowFileAccessFromFileURLs(bool allow) { - m_settings->setAllowUniversalAccessFromFileURLs(allow); + m_settings->setAllowFileAccessFromFileURLs(allow); } void WebSettingsImpl::setTextDirectionSubmenuInclusionBehaviorNeverIncluded() @@ -254,9 +269,64 @@ void WebSettingsImpl::setExperimentalWebGLEnabled(bool enabled) m_settings->setWebGLEnabled(enabled); } -void WebSettingsImpl::setGeolocationEnabled(bool enabled) +void WebSettingsImpl::setShowDebugBorders(bool show) +{ + m_settings->setShowDebugBorders(show); +} + +void WebSettingsImpl::setEditingBehavior(EditingBehavior behavior) +{ + m_settings->setEditingBehaviorType(static_cast<WebCore::EditingBehaviorType>(behavior)); +} + +void WebSettingsImpl::setAcceleratedCompositingEnabled(bool enabled) +{ + m_settings->setAcceleratedCompositingEnabled(enabled); +} + +void WebSettingsImpl::setAcceleratedCompositingFor3DTransformsEnabled(bool enabled) +{ + m_settings->setAcceleratedCompositingFor3DTransformsEnabled(enabled); +} + +void WebSettingsImpl::setAcceleratedCompositingForVideoEnabled(bool enabled) +{ + m_settings->setAcceleratedCompositingForVideoEnabled(enabled); +} + +void WebSettingsImpl::setAcceleratedCompositingForPluginsEnabled(bool enabled) +{ + m_settings->setAcceleratedCompositingForPluginsEnabled(enabled); +} + +void WebSettingsImpl::setAcceleratedCompositingForCanvasEnabled(bool enabled) +{ + m_settings->setAcceleratedCompositingForCanvasEnabled(enabled); +} + +void WebSettingsImpl::setAcceleratedCompositingForAnimationEnabled(bool enabled) +{ + m_settings->setAcceleratedCompositingForAnimationEnabled(enabled); +} + +void WebSettingsImpl::setAccelerated2dCanvasEnabled(bool enabled) +{ + m_settings->setAccelerated2dCanvasEnabled(enabled); +} + +void WebSettingsImpl::setMemoryInfoEnabled(bool enabled) +{ + m_settings->setMemoryInfoEnabled(enabled); +} + +void WebSettingsImpl::setHyperlinkAuditingEnabled(bool enabled) +{ + m_settings->setHyperlinkAuditingEnabled(enabled); +} + +void WebSettingsImpl::setCaretBrowsingEnabled(bool enabled) { - m_settings->setGeolocationEnabled(enabled); + m_settings->setCaretBrowsingEnabled(enabled); } } // namespace WebKit diff --git a/WebKit/chromium/src/WebSettingsImpl.h b/WebKit/chromium/src/WebSettingsImpl.h index 3b69fe6..ffdc8d3 100644 --- a/WebKit/chromium/src/WebSettingsImpl.h +++ b/WebKit/chromium/src/WebSettingsImpl.h @@ -31,8 +31,7 @@ #ifndef WebSettingsImpl_h #define WebSettingsImpl_h -// TODO(jorlow): Remove this hack once WebView is free of glue. -#include "../public/WebSettings.h" +#include "WebSettings.h" namespace WebCore { class Settings; @@ -71,19 +70,33 @@ public: virtual void setJavaEnabled(bool); virtual void setAllowScriptsToCloseWindows(bool); virtual void setUserStyleSheetLocation(const WebURL&); + virtual void setAuthorAndUserStylesEnabled(bool); virtual void setUsesPageCache(bool); virtual void setDownloadableBinaryFontsEnabled(bool); + virtual void setJavaScriptCanAccessClipboard(bool); virtual void setXSSAuditorEnabled(bool); virtual void setLocalStorageEnabled(bool); virtual void setEditableLinkBehaviorNeverLive(); + virtual void setFrameFlatteningEnabled(bool); virtual void setFontRenderingModeNormal(); virtual void setShouldPaintCustomScrollbars(bool); - virtual void setDatabasesEnabled(bool); virtual void setAllowUniversalAccessFromFileURLs(bool); + virtual void setAllowFileAccessFromFileURLs(bool); virtual void setTextDirectionSubmenuInclusionBehaviorNeverIncluded(); virtual void setOfflineWebApplicationCacheEnabled(bool); virtual void setExperimentalWebGLEnabled(bool); - virtual void setGeolocationEnabled(bool); + virtual void setShowDebugBorders(bool); + virtual void setEditingBehavior(EditingBehavior); + virtual void setAcceleratedCompositingEnabled(bool); + virtual void setAcceleratedCompositingFor3DTransformsEnabled(bool); + virtual void setAcceleratedCompositingForVideoEnabled(bool); + virtual void setAcceleratedCompositingForPluginsEnabled(bool); + virtual void setAcceleratedCompositingForCanvasEnabled(bool); + virtual void setAcceleratedCompositingForAnimationEnabled(bool); + virtual void setAccelerated2dCanvasEnabled(bool); + virtual void setMemoryInfoEnabled(bool); + virtual void setHyperlinkAuditingEnabled(bool); + virtual void setCaretBrowsingEnabled(bool); private: WebCore::Settings* m_settings; diff --git a/WebKit/chromium/src/WebSharedWorkerImpl.cpp b/WebKit/chromium/src/WebSharedWorkerImpl.cpp index 4547336..e73c0f4 100644 --- a/WebKit/chromium/src/WebSharedWorkerImpl.cpp +++ b/WebKit/chromium/src/WebSharedWorkerImpl.cpp @@ -31,7 +31,7 @@ #include "config.h" #include "WebSharedWorkerImpl.h" -#include "GenericWorkerTask.h" +#include "CrossThreadTask.h" #include "KURL.h" #include "MessageEvent.h" #include "MessagePortChannel.h" @@ -85,14 +85,14 @@ void WebSharedWorkerImpl::connectTask(ScriptExecutionContext* context, WebShared { // Wrap the passed-in channel in a MessagePort, and send it off via a connect event. RefPtr<MessagePort> port = MessagePort::create(*context); - port->entangle(channel.release()); + port->entangle(channel); ASSERT(context->isWorkerContext()); WorkerContext* workerContext = static_cast<WorkerContext*>(context); ASSERT(workerContext->isSharedWorkerContext()); workerContext->toSharedWorkerContext()->dispatchEvent(createConnectEvent(port)); } -void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& userAgent, const WebString& sourceCode) +void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& userAgent, const WebString& sourceCode, long long) { initializeLoader(url); setWorkerThread(SharedWorkerThread::create(name, url, userAgent, sourceCode, *this, *this)); diff --git a/WebKit/chromium/src/WebSharedWorkerImpl.h b/WebKit/chromium/src/WebSharedWorkerImpl.h index 7c10d76..b591c7b 100644 --- a/WebKit/chromium/src/WebSharedWorkerImpl.h +++ b/WebKit/chromium/src/WebSharedWorkerImpl.h @@ -51,7 +51,7 @@ public: // WebSharedWorker methods: virtual bool isStarted(); - virtual void startWorkerContext(const WebURL&, const WebString& name, const WebString& userAgent, const WebString& sourceCode); + virtual void startWorkerContext(const WebURL&, const WebString& name, const WebString& userAgent, const WebString& sourceCode, long long); virtual void connect(WebMessagePortChannel*, ConnectListener*); virtual void terminateWorkerContext(); virtual void clientDestroyed(); diff --git a/WebKit/chromium/src/WebSpeechInputControllerMockImpl.cpp b/WebKit/chromium/src/WebSpeechInputControllerMockImpl.cpp new file mode 100644 index 0000000..48f8b50 --- /dev/null +++ b/WebKit/chromium/src/WebSpeechInputControllerMockImpl.cpp @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebSpeechInputControllerMockImpl.h" + +#include "PlatformString.h" +#include "SpeechInputClientMock.h" +#include "WebRect.h" + +namespace WebKit { + +WebSpeechInputControllerMock* WebSpeechInputControllerMock::create(WebSpeechInputListener* listener) +{ + return new WebSpeechInputControllerMockImpl(listener); +} + +WebSpeechInputControllerMockImpl::WebSpeechInputControllerMockImpl( + WebSpeechInputListener* listener) + : m_webcoreMock(new WebCore::SpeechInputClientMock()) + , m_listener(listener) +{ + m_webcoreMock->setListener(this); +} + +WebSpeechInputControllerMockImpl::~WebSpeechInputControllerMockImpl() +{ + m_webcoreMock->setListener(0); +} + +void WebSpeechInputControllerMockImpl::addMockRecognitionResult(const WebString& result, double confidence, const WebString &language) +{ + m_webcoreMock->addRecognitionResult(result, confidence, language); +} + +void WebSpeechInputControllerMockImpl::clearResults() +{ + m_webcoreMock->clearResults(); +} + +void WebSpeechInputControllerMockImpl::didCompleteRecording(int requestId) +{ + m_listener->didCompleteRecording(requestId); +} + +void WebSpeechInputControllerMockImpl::didCompleteRecognition(int requestId) +{ + m_listener->didCompleteRecognition(requestId); +} + +void WebSpeechInputControllerMockImpl::setRecognitionResult(int requestId, const WebCore::SpeechInputResultArray& result) +{ + m_listener->setRecognitionResult(requestId, result); +} + +bool WebSpeechInputControllerMockImpl::startRecognition(int requestId, const WebRect& elementRect, const WebString& language, const WebString& grammar) +{ + return m_webcoreMock->startRecognition(requestId, elementRect, language, grammar); +} + +void WebSpeechInputControllerMockImpl::cancelRecognition(int requestId) +{ + m_webcoreMock->cancelRecognition(requestId); +} + +void WebSpeechInputControllerMockImpl::stopRecording(int requestId) +{ + m_webcoreMock->stopRecording(requestId); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebSpeechInputControllerMockImpl.h b/WebKit/chromium/src/WebSpeechInputControllerMockImpl.h new file mode 100644 index 0000000..bf00ed0 --- /dev/null +++ b/WebKit/chromium/src/WebSpeechInputControllerMockImpl.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WebSpeechInputControllerMockImpl_h +#define WebSpeechInputControllerMockImpl_h + +#include "SpeechInputListener.h" +#include "WebSpeechInputControllerMock.h" +#include "WebSpeechInputListener.h" +#include "WebString.h" +#include <wtf/OwnPtr.h> + +namespace WebCore { +class SpeechInputClientMock; +} + +namespace WebKit { + +struct WebRect; + +class WebSpeechInputControllerMockImpl : public WebCore::SpeechInputListener + , public WebSpeechInputControllerMock { +public: + WebSpeechInputControllerMockImpl(WebSpeechInputListener*); + virtual ~WebSpeechInputControllerMockImpl(); + + // WebCore::SpeechInputListener methods. + void didCompleteRecording(int requestId); + void didCompleteRecognition(int requestId); + void setRecognitionResult(int requestId, const WebCore::SpeechInputResultArray& result); + + // WebSpeechInputController methods. + bool startRecognition(int requestId, const WebRect& elementRect, const WebString& language, const WebString& grammar); + void cancelRecognition(int requestId); + void stopRecording(int requestId); + + // WebSpeechInputControllerMock methods. + void addMockRecognitionResult(const WebString& result, double confidence, const WebString& language); + void clearResults(); + +private: + OwnPtr<WebCore::SpeechInputClientMock> m_webcoreMock; + WebSpeechInputListener* m_listener; +}; + +} // namespace WebKit + +#endif // WebSpeechInputControllerMockImpl_h diff --git a/WebKit/chromium/src/WebSpeechInputResult.cpp b/WebKit/chromium/src/WebSpeechInputResult.cpp new file mode 100644 index 0000000..1cafc84 --- /dev/null +++ b/WebKit/chromium/src/WebSpeechInputResult.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 "config.h" +#include "WebSpeechInputResult.h" + +#include "SpeechInputResult.h" +#include <wtf/PassRefPtr.h> + +namespace WebKit { + +void WebSpeechInputResult::reset() +{ + m_private.reset(); +} + +WebSpeechInputResult::WebSpeechInputResult(const PassRefPtr<WebCore::SpeechInputResult>& value) + : m_private(value) +{ +} + +void WebSpeechInputResult::set(const WebString& utterance, double confidence) +{ + m_private = WebCore::SpeechInputResult::create(utterance, confidence); +} + +WebSpeechInputResult::operator PassRefPtr<WebCore::SpeechInputResult>() const +{ + return m_private.get(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebStorageAreaImpl.cpp b/WebKit/chromium/src/WebStorageAreaImpl.cpp index 9a7fd5c..2cecfe9 100644 --- a/WebKit/chromium/src/WebStorageAreaImpl.cpp +++ b/WebKit/chromium/src/WebStorageAreaImpl.cpp @@ -66,7 +66,7 @@ WebString WebStorageAreaImpl::getItem(const WebString& key) return m_storageArea->getItem(key); } -void WebStorageAreaImpl::setItem(const WebString& key, const WebString& value, const WebURL& url, Result& result, WebString& oldValue) +void WebStorageAreaImpl::setItem(const WebString& key, const WebString& value, const WebURL& url, Result& result, WebString& oldValue, WebFrame*) { int exceptionCode = 0; diff --git a/WebKit/chromium/src/WebStorageAreaImpl.h b/WebKit/chromium/src/WebStorageAreaImpl.h index e9a11c2..2869fc9 100644 --- a/WebKit/chromium/src/WebStorageAreaImpl.h +++ b/WebKit/chromium/src/WebStorageAreaImpl.h @@ -45,7 +45,7 @@ public: virtual unsigned length(); virtual WebString key(unsigned index); virtual WebString getItem(const WebString& key); - virtual void setItem(const WebString& key, const WebString& value, const WebURL& url, Result& result, WebString& oldValue); + virtual void setItem(const WebString& key, const WebString& value, const WebURL& url, Result& result, WebString& oldValue, WebFrame*); virtual void removeItem(const WebString& key, const WebURL& url, WebString& oldValue); virtual void clear(const WebURL& url, bool& somethingCleared); diff --git a/WebKit/chromium/src/WebStorageNamespaceImpl.cpp b/WebKit/chromium/src/WebStorageNamespaceImpl.cpp index e6f6548..53b4a75 100644 --- a/WebKit/chromium/src/WebStorageNamespaceImpl.cpp +++ b/WebKit/chromium/src/WebStorageNamespaceImpl.cpp @@ -45,9 +45,9 @@ WebStorageNamespace* WebStorageNamespace::createLocalStorageNamespace(const WebS return new WebStorageNamespaceImpl(WebCore::StorageNamespaceImpl::localStorageNamespace(path, quota)); } -WebStorageNamespace* WebStorageNamespace::createSessionStorageNamespace() +WebStorageNamespace* WebStorageNamespace::createSessionStorageNamespace(unsigned quota) { - return new WebStorageNamespaceImpl(WebCore::StorageNamespaceImpl::sessionStorageNamespace()); + return new WebStorageNamespaceImpl(WebCore::StorageNamespaceImpl::sessionStorageNamespace(quota)); } WebStorageNamespaceImpl::WebStorageNamespaceImpl(PassRefPtr<WebCore::StorageNamespace> storageNamespace) @@ -61,7 +61,7 @@ WebStorageNamespaceImpl::~WebStorageNamespaceImpl() WebStorageArea* WebStorageNamespaceImpl::createStorageArea(const WebString& originString) { - WebCore::String originWebCoreString = originString; + WTF::String originWebCoreString = originString; if (originWebCoreString == "file://") { // FIXME: We should really be passing around WebSecurityOrigin objects // to represent security origins instead of strings. One issue diff --git a/WebKit/chromium/src/WebString.cpp b/WebKit/chromium/src/WebString.cpp index 36d5f86..a091ef4 100644 --- a/WebKit/chromium/src/WebString.cpp +++ b/WebKit/chromium/src/WebString.cpp @@ -31,15 +31,15 @@ #include "config.h" #include "WebString.h" -#include "AtomicString.h" -#include "CString.h" #include "PlatformString.h" +#include <wtf/text/CString.h> +#include <wtf/text/AtomicString.h> #include "WebCString.h" namespace WebKit { -class WebStringPrivate : public WebCore::StringImpl { +class WebStringPrivate : public WTF::StringImpl { }; void WebString::reset() @@ -58,7 +58,7 @@ void WebString::assign(const WebString& other) void WebString::assign(const WebUChar* data, size_t length) { assign(static_cast<WebStringPrivate*>( - WebCore::StringImpl::create(data, length).get())); + WTF::StringImpl::create(data, length).get())); } size_t WebString::length() const @@ -73,17 +73,17 @@ const WebUChar* WebString::data() const WebCString WebString::utf8() const { - return WebCore::String(m_private).utf8(); + return WTF::String(m_private).utf8(); } WebString WebString::fromUTF8(const char* data, size_t length) { - return WebCore::String::fromUTF8(data, length); + return WTF::String::fromUTF8(data, length); } WebString WebString::fromUTF8(const char* data) { - return WebCore::String::fromUTF8(data); + return WTF::String::fromUTF8(data); } bool WebString::equals(const WebString& s) const @@ -91,39 +91,39 @@ bool WebString::equals(const WebString& s) const return equal(m_private, s.m_private); } -WebString::WebString(const WebCore::String& s) +WebString::WebString(const WTF::String& s) : m_private(static_cast<WebStringPrivate*>(s.impl())) { if (m_private) m_private->ref(); } -WebString& WebString::operator=(const WebCore::String& s) +WebString& WebString::operator=(const WTF::String& s) { assign(static_cast<WebStringPrivate*>(s.impl())); return *this; } -WebString::operator WebCore::String() const +WebString::operator WTF::String() const { return m_private; } -WebString::WebString(const WebCore::AtomicString& s) +WebString::WebString(const WTF::AtomicString& s) : m_private(0) { assign(s.string()); } -WebString& WebString::operator=(const WebCore::AtomicString& s) +WebString& WebString::operator=(const WTF::AtomicString& s) { assign(s.string()); return *this; } -WebString::operator WebCore::AtomicString() const +WebString::operator WTF::AtomicString() const { - return WebCore::AtomicString(static_cast<WebCore::StringImpl *>(m_private)); + return WTF::AtomicString(static_cast<WTF::StringImpl *>(m_private)); } void WebString::assign(WebStringPrivate* p) diff --git a/WebKit/chromium/src/WebTextRun.cpp b/WebKit/chromium/src/WebTextRun.cpp new file mode 100644 index 0000000..58d9fac --- /dev/null +++ b/WebKit/chromium/src/WebTextRun.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebTextRun.h" + +#include "TextRun.h" + +using namespace WebCore; + +namespace WebKit { + +WebTextRun::operator WebCore::TextRun() const +{ + return TextRun(text, false, 0, 0, rtl, directionalOverride); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebThreadSafeData.cpp b/WebKit/chromium/src/WebThreadSafeData.cpp new file mode 100755 index 0000000..facaba3 --- /dev/null +++ b/WebKit/chromium/src/WebThreadSafeData.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebThreadSafeData.h" + +#include "BlobData.h" + +using namespace WebCore; + +namespace WebKit { + +void WebThreadSafeData::reset() +{ + m_private.reset(); +} + +void WebThreadSafeData::assign(const WebThreadSafeData& other) +{ + m_private = other.m_private; +} + +size_t WebThreadSafeData::size() const +{ + if (m_private.isNull()) + return 0; + return m_private->length(); +} + +const char* WebThreadSafeData::data() const +{ + if (m_private.isNull()) + return 0; + return m_private->data(); +} + +WebThreadSafeData::WebThreadSafeData(const PassRefPtr<RawData>& data) + : m_private(data.releaseRef()) +{ +} + +WebThreadSafeData& WebThreadSafeData::operator=(const PassRefPtr<RawData>& data) +{ + m_private = data; + return *this; +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebURLError.cpp b/WebKit/chromium/src/WebURLError.cpp index a038aee..ef32b5c 100644 --- a/WebKit/chromium/src/WebURLError.cpp +++ b/WebKit/chromium/src/WebURLError.cpp @@ -31,9 +31,9 @@ #include "config.h" #include "WebURLError.h" -#include "CString.h" #include "KURL.h" #include "ResourceError.h" +#include <wtf/text/CString.h> using namespace WebCore; diff --git a/WebKit/chromium/src/WebURLLoadTiming.cpp b/WebKit/chromium/src/WebURLLoadTiming.cpp new file mode 100644 index 0000000..27ed362 --- /dev/null +++ b/WebKit/chromium/src/WebURLLoadTiming.cpp @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebURLLoadTiming.h" + +#include "ResourceLoadTiming.h" +#include "WebString.h" + +using namespace WebCore; + +namespace WebKit { + +void WebURLLoadTiming::initialize() +{ + m_private = ResourceLoadTiming::create(); +} + +void WebURLLoadTiming::reset() +{ + m_private.reset(); +} + +void WebURLLoadTiming::assign(const WebURLLoadTiming& other) +{ + m_private = other.m_private; +} + +double WebURLLoadTiming::requestTime() const +{ + return m_private->requestTime; +} + +void WebURLLoadTiming::setRequestTime(double time) +{ + m_private->requestTime = time; +} + +int WebURLLoadTiming::proxyStart() const +{ + return m_private->proxyStart; +} + +void WebURLLoadTiming::setProxyStart(int start) +{ + m_private->proxyStart = start; +} + +int WebURLLoadTiming::proxyEnd() const +{ + return m_private->proxyEnd; +} + +void WebURLLoadTiming::setProxyEnd(int end) +{ + m_private->proxyEnd = end; +} + +int WebURLLoadTiming::dnsStart() const +{ + return m_private->dnsStart; +} + +void WebURLLoadTiming::setDNSStart(int start) +{ + m_private->dnsStart = start; +} + +int WebURLLoadTiming::dnsEnd() const +{ + return m_private->dnsEnd; +} + +void WebURLLoadTiming::setDNSEnd(int end) +{ + m_private->dnsEnd = end; +} + +int WebURLLoadTiming::connectStart() const +{ + return m_private->connectStart; +} + +void WebURLLoadTiming::setConnectStart(int start) +{ + m_private->connectStart = start; +} + +int WebURLLoadTiming::connectEnd() const +{ + return m_private->connectEnd; +} + +void WebURLLoadTiming::setConnectEnd(int end) +{ + m_private->connectEnd = end; +} + +int WebURLLoadTiming::sendStart() const +{ + return m_private->sendStart; +} + +void WebURLLoadTiming::setSendStart(int start) +{ + m_private->sendStart = start; +} + +int WebURLLoadTiming::sendEnd() const +{ + return m_private->sendEnd; +} + +void WebURLLoadTiming::setSendEnd(int end) +{ + m_private->sendEnd = end; +} + +int WebURLLoadTiming::receiveHeadersEnd() const +{ + return m_private->receiveHeadersEnd; +} + +void WebURLLoadTiming::setReceiveHeadersEnd(int end) +{ + m_private->receiveHeadersEnd = end; +} + +int WebURLLoadTiming::sslStart() const +{ + return m_private->sslStart; +} + +void WebURLLoadTiming::setSSLStart(int start) +{ + m_private->sslStart = start; +} + +int WebURLLoadTiming::sslEnd() const +{ + return m_private->sslEnd; +} + +void WebURLLoadTiming::setSSLEnd(int end) +{ + m_private->sslEnd = end; +} + +WebURLLoadTiming::WebURLLoadTiming(const PassRefPtr<ResourceLoadTiming>& value) + : m_private(value) +{ +} + +WebURLLoadTiming& WebURLLoadTiming::operator=(const PassRefPtr<ResourceLoadTiming>& value) +{ + m_private = value; + return *this; +} + +WebURLLoadTiming::operator PassRefPtr<ResourceLoadTiming>() const +{ + return m_private.get(); +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/WebURLRequest.cpp b/WebKit/chromium/src/WebURLRequest.cpp index 46fa842..7a77ca3 100644 --- a/WebKit/chromium/src/WebURLRequest.cpp +++ b/WebKit/chromium/src/WebURLRequest.cpp @@ -55,6 +55,8 @@ public: : m_resourceRequestAllocation(*p->m_resourceRequest) { m_resourceRequest = &m_resourceRequestAllocation; + m_allowStoredCredentials = p->m_allowStoredCredentials; + m_downloadToFile = p->m_downloadToFile; } virtual void dispose() { delete this; } @@ -194,11 +196,41 @@ void WebURLRequest::setReportUploadProgress(bool reportUploadProgress) m_private->m_resourceRequest->setReportUploadProgress(reportUploadProgress); } +bool WebURLRequest::reportLoadTiming() const +{ + return m_private->m_resourceRequest->reportLoadTiming(); +} + +void WebURLRequest::setReportRawHeaders(bool reportRawHeaders) +{ + m_private->m_resourceRequest->setReportRawHeaders(reportRawHeaders); +} + +bool WebURLRequest::reportRawHeaders() const +{ + return m_private->m_resourceRequest->reportRawHeaders(); +} + +void WebURLRequest::setReportLoadTiming(bool reportLoadTiming) +{ + m_private->m_resourceRequest->setReportLoadTiming(reportLoadTiming); +} + WebURLRequest::TargetType WebURLRequest::targetType() const { return static_cast<TargetType>(m_private->m_resourceRequest->targetType()); } +bool WebURLRequest::hasUserGesture() const +{ + return m_private->m_resourceRequest->hasUserGesture(); +} + +void WebURLRequest::setHasUserGesture(bool hasUserGesture) +{ + m_private->m_resourceRequest->setHasUserGesture(hasUserGesture); +} + void WebURLRequest::setTargetType(TargetType targetType) { m_private->m_resourceRequest->setTargetType( @@ -235,6 +267,16 @@ void WebURLRequest::setAppCacheHostID(int appCacheHostID) m_private->m_resourceRequest->setAppCacheHostID(appCacheHostID); } +bool WebURLRequest::downloadToFile() const +{ + return m_private->m_downloadToFile; +} + +void WebURLRequest::setDownloadToFile(bool downloadToFile) +{ + m_private->m_downloadToFile = downloadToFile; +} + ResourceRequest& WebURLRequest::toMutableResourceRequest() { ASSERT(m_private); diff --git a/WebKit/chromium/src/WebURLRequestPrivate.h b/WebKit/chromium/src/WebURLRequestPrivate.h index 2f7c25f..79f6451 100644 --- a/WebKit/chromium/src/WebURLRequestPrivate.h +++ b/WebKit/chromium/src/WebURLRequestPrivate.h @@ -37,13 +37,19 @@ namespace WebKit { class WebURLRequestPrivate { public: - WebURLRequestPrivate() : m_resourceRequest(0), m_allowStoredCredentials(true) { } + WebURLRequestPrivate() + : m_resourceRequest(0) + , m_allowStoredCredentials(true) + , m_downloadToFile(false) { } // Called by WebURLRequest when it no longer needs this object. virtual void dispose() = 0; WebCore::ResourceRequest* m_resourceRequest; bool m_allowStoredCredentials; + + // FIXME: Move this to ResourceRequest once we have an internal consumer. + bool m_downloadToFile; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebURLResponse.cpp b/WebKit/chromium/src/WebURLResponse.cpp index 95e0be2..bf3c521 100644 --- a/WebKit/chromium/src/WebURLResponse.cpp +++ b/WebKit/chromium/src/WebURLResponse.cpp @@ -32,12 +32,17 @@ #include "WebURLResponse.h" #include "ResourceResponse.h" +#include "ResourceLoadTiming.h" #include "WebHTTPHeaderVisitor.h" +#include "WebHTTPLoadInfo.h" #include "WebString.h" #include "WebURL.h" +#include "WebURLLoadTiming.h" #include "WebURLResponsePrivate.h" +#include <wtf/RefPtr.h> + using namespace WebCore; namespace WebKit { @@ -55,6 +60,7 @@ public: : m_resourceResponseAllocation(*p->m_resourceResponse) { m_resourceResponse = &m_resourceResponseAllocation; + m_downloadFilePath = p->m_downloadFilePath; } virtual void dispose() { delete this; } @@ -93,6 +99,57 @@ void WebURLResponse::setURL(const WebURL& url) m_private->m_resourceResponse->setURL(url); } +unsigned WebURLResponse::connectionID() const +{ + return m_private->m_resourceResponse->connectionID(); +} + +void WebURLResponse::setConnectionID(unsigned connectionID) +{ + m_private->m_resourceResponse->setConnectionID(connectionID); +} + +bool WebURLResponse::connectionReused() const +{ + return m_private->m_resourceResponse->connectionReused(); +} + +void WebURLResponse::setConnectionReused(bool connectionReused) +{ + m_private->m_resourceResponse->setConnectionReused(connectionReused); +} + +WebURLLoadTiming WebURLResponse::loadTiming() +{ + return WebURLLoadTiming(m_private->m_resourceResponse->resourceLoadTiming()); +} + +void WebURLResponse::setLoadTiming(const WebURLLoadTiming& timing) +{ + RefPtr<ResourceLoadTiming> loadTiming = PassRefPtr<ResourceLoadTiming>(timing); + m_private->m_resourceResponse->setResourceLoadTiming(loadTiming.release()); +} + +WebHTTPLoadInfo WebURLResponse::httpLoadInfo() +{ + return WebHTTPLoadInfo(m_private->m_resourceResponse->resourceLoadInfo()); +} + +void WebURLResponse::setHTTPLoadInfo(const WebHTTPLoadInfo& value) +{ + m_private->m_resourceResponse->setResourceLoadInfo(value); +} + +double WebURLResponse::responseTime() const +{ + return m_private->m_resourceResponse->responseTime(); +} + +void WebURLResponse::setResponseTime(double responseTime) +{ + m_private->m_resourceResponse->setResponseTime(responseTime); +} + WebString WebURLResponse::mimeType() const { return m_private->m_resourceResponse->mimeType(); @@ -165,6 +222,8 @@ void WebURLResponse::setHTTPHeaderField(const WebString& name, const WebString& void WebURLResponse::addHTTPHeaderField(const WebString& name, const WebString& value) { + if (name.isNull() || value.isNull()) + return; // FIXME: Add an addHTTPHeaderField method to ResourceResponse. const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields(); String valueStr(value); @@ -255,6 +314,16 @@ const ResourceResponse& WebURLResponse::toResourceResponse() const return *m_private->m_resourceResponse; } +bool WebURLResponse::wasCached() const +{ + return m_private->m_resourceResponse->wasCached(); +} + +void WebURLResponse::setWasCached(bool value) +{ + m_private->m_resourceResponse->setWasCached(value); +} + bool WebURLResponse::wasFetchedViaSPDY() const { return m_private->m_resourceResponse->wasFetchedViaSPDY(); @@ -265,6 +334,56 @@ void WebURLResponse::setWasFetchedViaSPDY(bool value) m_private->m_resourceResponse->setWasFetchedViaSPDY(value); } +bool WebURLResponse::wasNpnNegotiated() const +{ + return m_private->m_resourceResponse->wasNpnNegotiated(); +} + +void WebURLResponse::setWasNpnNegotiated(bool value) +{ + m_private->m_resourceResponse->setWasNpnNegotiated(value); +} + +bool WebURLResponse::wasAlternateProtocolAvailable() const +{ + return m_private->m_resourceResponse->wasAlternateProtocolAvailable(); +} + +void WebURLResponse::setWasAlternateProtocolAvailable(bool value) +{ + m_private->m_resourceResponse->setWasAlternateProtocolAvailable(value); +} + +bool WebURLResponse::wasFetchedViaProxy() const +{ + return m_private->m_resourceResponse->wasFetchedViaProxy(); +} + +void WebURLResponse::setWasFetchedViaProxy(bool value) +{ + m_private->m_resourceResponse->setWasFetchedViaProxy(value); +} + +bool WebURLResponse::isMultipartPayload() const +{ + return m_private->m_resourceResponse->isMultipartPayload(); +} + +void WebURLResponse::setIsMultipartPayload(bool value) +{ + m_private->m_resourceResponse->setIsMultipartPayload(value); +} + +WebString WebURLResponse::downloadFilePath() const +{ + return m_private->m_downloadFilePath; +} + +void WebURLResponse::setDownloadFilePath(const WebString& downloadFilePath) +{ + m_private->m_downloadFilePath = downloadFilePath; +} + void WebURLResponse::assign(WebURLResponsePrivate* p) { // Subclasses may call this directly so a self-assignment check is needed diff --git a/WebKit/chromium/src/WebURLResponsePrivate.h b/WebKit/chromium/src/WebURLResponsePrivate.h index 716c8db..dc5ce22 100644 --- a/WebKit/chromium/src/WebURLResponsePrivate.h +++ b/WebKit/chromium/src/WebURLResponsePrivate.h @@ -31,6 +31,8 @@ #ifndef WebURLResponsePrivate_h #define WebURLResponsePrivate_h +#include "WebString.h" + namespace WebCore { class ResourceResponse; } namespace WebKit { @@ -43,6 +45,9 @@ public: virtual void dispose() = 0; WebCore::ResourceResponse* m_resourceResponse; + + // FIXME: Move this to ResourceResponse once we have an internal consumer. + WebString m_downloadFilePath; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebViewImpl.cpp b/WebKit/chromium/src/WebViewImpl.cpp index ce03523..7bec254 100644 --- a/WebKit/chromium/src/WebViewImpl.cpp +++ b/WebKit/chromium/src/WebViewImpl.cpp @@ -32,35 +32,44 @@ #include "WebViewImpl.h" #include "AutoFillPopupMenuClient.h" -#include "AutocompletePopupMenuClient.h" #include "AXObjectCache.h" +#include "BackForwardListImpl.h" #include "Chrome.h" +#include "ChromiumBridge.h" +#include "ColorSpace.h" +#include "CompositionUnderlineVectorBuilder.h" #include "ContextMenu.h" #include "ContextMenuController.h" #include "ContextMenuItem.h" #include "CSSStyleSelector.h" #include "CSSValueKeywords.h" #include "Cursor.h" +#include "DeviceOrientationClientProxy.h" #include "Document.h" #include "DocumentLoader.h" #include "DOMUtilitiesPrivate.h" #include "DragController.h" +#include "DragScrollTimer.h" #include "DragData.h" #include "Editor.h" #include "EventHandler.h" +#include "Extensions3D.h" #include "FocusController.h" #include "FontDescription.h" #include "FrameLoader.h" #include "FrameTree.h" #include "FrameView.h" #include "GraphicsContext.h" -#include "HitTestResult.h" +#include "GraphicsContext3D.h" +#include "GraphicsContext3DInternal.h" #include "HTMLInputElement.h" #include "HTMLMediaElement.h" +#include "HitTestResult.h" #include "HTMLNames.h" #include "Image.h" +#include "ImageBuffer.h" +#include "ImageData.h" #include "InspectorController.h" -#include "IntRect.h" #include "KeyboardCodes.h" #include "KeyboardEvent.h" #include "MIMETypeRegistry.h" @@ -72,8 +81,8 @@ #include "PlatformContextSkia.h" #include "PlatformKeyboardEvent.h" #include "PlatformMouseEvent.h" +#include "PlatformThemeChromiumGtk.h" #include "PlatformWheelEvent.h" -#include "PluginInfoStore.h" #include "PopupMenuChromium.h" #include "PopupMenuClient.h" #include "ProgressTracker.h" @@ -82,31 +91,46 @@ #include "SecurityOrigin.h" #include "SelectionController.h" #include "Settings.h" +#include "SpeechInputClientImpl.h" +#include "Timer.h" #include "TypingCommand.h" +#include "UserGestureIndicator.h" +#include "Vector.h" #include "WebAccessibilityObject.h" #include "WebDevToolsAgentPrivate.h" +#include "WebDevToolsAgentImpl.h" #include "WebDragData.h" #include "WebFrameImpl.h" +#include "WebImage.h" +#include "WebInputElement.h" #include "WebInputEvent.h" #include "WebInputEventConversion.h" +#include "WebKit.h" +#include "WebKitClient.h" #include "WebMediaPlayerAction.h" #include "WebNode.h" +#include "WebPlugin.h" +#include "WebPluginContainerImpl.h" #include "WebPoint.h" #include "WebPopupMenuImpl.h" #include "WebRect.h" +#include "WebRuntimeFeatures.h" #include "WebSettingsImpl.h" #include "WebString.h" #include "WebVector.h" #include "WebViewClient.h" +#include <wtf/RefPtr.h> + +#if PLATFORM(CG) +#include <CoreGraphics/CGContext.h> +#endif #if OS(WINDOWS) -#include "KeyboardCodesWin.h" #include "RenderThemeChromiumWin.h" #else -#if OS(LINUX) +#if OS(LINUX) || OS(FREEBSD) #include "RenderThemeChromiumLinux.h" #endif -#include "KeyboardCodesPosix.h" #include "RenderTheme.h" #endif @@ -116,15 +140,37 @@ using namespace WebCore; +namespace { + +GraphicsContext3D::Attributes getCompositorContextAttributes() +{ + // Explicitly disable antialiasing for the compositor. As of the time of + // this writing, the only platform that supported antialiasing for the + // compositor was Mac OS X, because the on-screen OpenGL context creation + // code paths on Windows and Linux didn't yet have multisampling support. + // Mac OS X essentially always behaves as though it's rendering offscreen. + // Multisampling has a heavy cost especially on devices with relatively low + // fill rate like most notebooks, and the Mac implementation would need to + // be optimized to resolve directly into the IOSurface shared between the + // GPU and browser processes. For these reasons and to avoid platform + // disparities we explicitly disable antialiasing. + GraphicsContext3D::Attributes attributes; + attributes.antialias = false; + return attributes; +} + +} // anonymous namespace + namespace WebKit { // Change the text zoom level by kTextSizeMultiplierRatio each time the user // zooms text in or out (ie., change by 20%). The min and max values limit // text zoom to half and 3x the original text size. These three values match // those in Apple's port in WebKit/WebKit/WebView/WebView.mm -static const double textSizeMultiplierRatio = 1.2; -static const double minTextSizeMultiplier = 0.5; -static const double maxTextSizeMultiplier = 3.0; +const double WebView::textSizeMultiplierRatio = 1.2; +const double WebView::minTextSizeMultiplier = 0.5; +const double WebView::maxTextSizeMultiplier = 3.0; + // The group name identifies a namespace of pages. Page group is used on OSX // for some programs that use HTML views to display things that don't seem like @@ -133,8 +179,8 @@ static const double maxTextSizeMultiplier = 3.0; const char* pageGroupName = "default"; // Used to defer all page activity in cases where the embedder wishes to run -// a nested event loop. -static PageGroupLoadDeferrer* pageGroupLoadDeferrer; +// a nested event loop. Using a stack enables nesting of message loop invocations. +static Vector<PageGroupLoadDeferrer*> pageGroupLoadDeferrerStack; // Ensure that the WebDragOperation enum values stay in sync with the original // DragOperation constants. @@ -149,26 +195,34 @@ COMPILE_ASSERT_MATCHING_ENUM(DragOperationMove); COMPILE_ASSERT_MATCHING_ENUM(DragOperationDelete); COMPILE_ASSERT_MATCHING_ENUM(DragOperationEvery); -// Note that focusOnShow is false so that the suggestions popup is shown not -// activated. We need the page to still have focus so the user can keep typing -// while the popup is showing. -static const PopupContainerSettings suggestionsPopupSettings = { - false, // focusOnShow - false, // setTextOnIndexChange - false, // acceptOnAbandon - true, // loopSelectionNavigation - true, // restrictWidthOfListBox. Same as other browser (Fx, IE, and safari) +static const PopupContainerSettings autoFillPopupSettings = { + false, // setTextOnIndexChange + false, // acceptOnAbandon + true, // loopSelectionNavigation + false, // restrictWidthOfListBox (For security reasons show the entire entry + // so the user doesn't enter information he did not intend to.) // For suggestions, we use the direction of the input field as the direction // of the popup items. The main reason is to keep the display of items in // drop-down the same as the items in the input field. PopupContainerSettings::DOMElementDirection, }; +static bool shouldUseExternalPopupMenus = false; + // WebView ---------------------------------------------------------------- -WebView* WebView::create(WebViewClient* client) +WebView* WebView::create(WebViewClient* client, WebDevToolsAgentClient* devToolsClient) +{ + // Keep runtime flag for device motion turned off until it's implemented. + WebRuntimeFeatures::enableDeviceMotion(false); + + // Pass the WebViewImpl's self-reference to the caller. + return adoptRef(new WebViewImpl(client, devToolsClient)).leakRef(); +} + +void WebView::setUseExternalPopupMenus(bool useExternalPopupMenus) { - return new WebViewImpl(client); + shouldUseExternalPopupMenus = useExternalPopupMenus; } void WebView::updateVisitedLinkState(unsigned long long linkHash) @@ -183,24 +237,23 @@ void WebView::resetVisitedLinkState() void WebView::willEnterModalLoop() { - // It is not valid to nest more than once. - ASSERT(!pageGroupLoadDeferrer); - PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName); ASSERT(pageGroup); - ASSERT(!pageGroup->pages().isEmpty()); - // Pick any page in the page group since we are deferring all pages. - pageGroupLoadDeferrer = new PageGroupLoadDeferrer(*pageGroup->pages().begin(), true); + if (pageGroup->pages().isEmpty()) + pageGroupLoadDeferrerStack.append(static_cast<PageGroupLoadDeferrer*>(0)); + else { + // Pick any page in the page group since we are deferring all pages. + pageGroupLoadDeferrerStack.append(new PageGroupLoadDeferrer(*pageGroup->pages().begin(), true)); + } } void WebView::didExitModalLoop() { - // The embedder must have called willEnterNestedEventLoop. - ASSERT(pageGroupLoadDeferrer); + ASSERT(pageGroupLoadDeferrerStack.size()); - delete pageGroupLoadDeferrer; - pageGroupLoadDeferrer = 0; + delete pageGroupLoadDeferrerStack.last(); + pageGroupLoadDeferrerStack.removeLast(); } void WebViewImpl::initializeMainFrame(WebFrameClient* frameClient) @@ -216,7 +269,7 @@ void WebViewImpl::initializeMainFrame(WebFrameClient* frameClient) SecurityOrigin::setLocalLoadPolicy(SecurityOrigin::AllowLocalLoadsForLocalOnly); } -WebViewImpl::WebViewImpl(WebViewClient* client) +WebViewImpl::WebViewImpl(WebViewClient* client, WebDevToolsAgentClient* devToolsClient) : m_client(client) , m_backForwardListClientImpl(this) , m_chromeClientImpl(this) @@ -229,6 +282,8 @@ WebViewImpl::WebViewImpl(WebViewClient* client) , m_newNavigationLoader(0) #endif , m_zoomLevel(0) + , m_minimumZoomLevel(zoomFactorToZoomLevel(minTextSizeMultiplier)) + , m_maximumZoomLevel(zoomFactorToZoomLevel(maxTextSizeMultiplier)) , m_contextMenuAllowed(false) , m_doingDragAndDrop(false) , m_ignoreInputEvents(false) @@ -240,31 +295,51 @@ WebViewImpl::WebViewImpl(WebViewClient* client) , m_dropEffect(DropEffectDefault) , m_operationsAllowed(WebDragOperationNone) , m_dragOperation(WebDragOperationNone) - , m_suggestionsPopupShowing(false) - , m_suggestionsPopupClient(0) - , m_suggestionsPopup(0) + , m_autoFillPopupShowing(false) + , m_autoFillPopupClient(0) + , m_autoFillPopup(0) , m_isTransparent(false) , m_tabsToLinks(false) + , m_dragScrollTimer(new DragScrollTimer()) +#if USE(ACCELERATED_COMPOSITING) + , m_layerRenderer(0) + , m_isAcceleratedCompositingActive(false) + , m_compositorCreationFailed(false) +#endif +#if ENABLE(INPUT_SPEECH) + , m_speechInputClient(SpeechInputClientImpl::create(client)) +#endif + , m_deviceOrientationClientProxy(new DeviceOrientationClientProxy(client ? client->deviceOrientationClient() : 0)) { // WebKit/win/WebView.cpp does the same thing, except they call the // KJS specific wrapper around this method. We need to have threading // initialized because CollatorICU requires it. WTF::initializeThreading(); + WTF::initializeMainThread(); // set to impossible point so we always get the first mouse pos m_lastMousePosition = WebPoint(-1, -1); - // the page will take ownership of the various clients - m_page.set(new Page(&m_chromeClientImpl, - &m_contextMenuClientImpl, - &m_editorClientImpl, - &m_dragClientImpl, - &m_inspectorClientImpl, - 0, - 0)); + if (devToolsClient) + m_devToolsAgent = new WebDevToolsAgentImpl(this, devToolsClient); + + Page::PageClients pageClients; + pageClients.chromeClient = &m_chromeClientImpl; + pageClients.contextMenuClient = &m_contextMenuClientImpl; + pageClients.editorClient = &m_editorClientImpl; + pageClients.dragClient = &m_dragClientImpl; + pageClients.inspectorClient = &m_inspectorClientImpl; +#if ENABLE(INPUT_SPEECH) + pageClients.speechInputClient = m_speechInputClient.get(); +#endif + pageClients.deviceOrientationClient = m_deviceOrientationClientProxy.get(); + + m_page.set(new Page(pageClients)); - m_page->backForwardList()->setClient(&m_backForwardListClientImpl); + static_cast<BackForwardListImpl*>(m_page->backForwardList())->setClient(&m_backForwardListClientImpl); m_page->setGroupName(pageGroupName); + + m_inspectorSettingsMap.set(new SettingsMap); } WebViewImpl::~WebViewImpl() @@ -326,19 +401,34 @@ void WebViewImpl::mouseDown(const WebMouseEvent& event) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) return; + // If there is a select popup open, close it as the user is clicking on + // the page (outside of the popup). We also save it so we can prevent a + // click on the select element from immediately reopening the popup. + RefPtr<WebCore::PopupContainer> selectPopup; + if (event.button == WebMouseEvent::ButtonLeft) { + selectPopup = m_selectPopup; + hideSelectPopup(); + ASSERT(!m_selectPopup); + } + m_lastMouseDownPoint = WebPoint(event.x, event.y); - // If a text field that has focus is clicked again, we should display the - // suggestions popup. RefPtr<Node> clickedNode; if (event.button == WebMouseEvent::ButtonLeft) { + IntPoint point(event.x, event.y); + point = m_page->mainFrame()->view()->windowToContents(point); + HitTestResult result(m_page->mainFrame()->eventHandler()->hitTestResultAtPoint(point, false)); + Node* hitNode = result.innerNonSharedNode(); + + // Take capture on a mouse down on a plugin so we can send it mouse events. + if (hitNode && hitNode->renderer() && hitNode->renderer()->isEmbeddedObject()) + m_mouseCaptureNode = hitNode; + + // If a text field that has focus is clicked again, we should display the + // AutoFill popup. RefPtr<Node> focusedNode = focusedWebCoreNode(); if (focusedNode.get() && toHTMLInputElement(focusedNode.get())) { - IntPoint point(event.x, event.y); - point = m_page->mainFrame()->view()->windowToContents(point); - HitTestResult result(point); - result = m_page->mainFrame()->eventHandler()->hitTestResultAtPoint(point, false); - if (result.innerNonSharedNode() == focusedNode) { + if (hitNode == focusedNode) { // Already focused text field was clicked, let's remember this. If // focus has not changed after the mouse event is processed, we'll // trigger the autocomplete. @@ -347,14 +437,23 @@ void WebViewImpl::mouseDown(const WebMouseEvent& event) } } + mainFrameImpl()->frame()->loader()->resetMultipleFormSubmissionProtection(); + mainFrameImpl()->frame()->eventHandler()->handleMousePressEvent( PlatformMouseEventBuilder(mainFrameImpl()->frameView(), event)); if (clickedNode.get() && clickedNode == focusedWebCoreNode()) { - // Focus has not changed, show the suggestions popup. + // Focus has not changed, show the AutoFill popup. static_cast<EditorClientImpl*>(m_page->editorClient())-> showFormAutofillForNode(clickedNode.get()); } + if (m_selectPopup && m_selectPopup == selectPopup) { + // That click triggered a select popup which is the same as the one that + // was showing before the click. It means the user clicked the select + // while the popup was showing, and as a result we first closed then + // immediately reopened the select popup. It needs to be closed. + hideSelectPopup(); + } // Dispatch the contextmenu event regardless of if the click was swallowed. // On Windows, we handle it on mouse up, not down. @@ -363,7 +462,7 @@ void WebViewImpl::mouseDown(const WebMouseEvent& event) || (event.button == WebMouseEvent::ButtonLeft && event.modifiers & WebMouseEvent::ControlKey)) mouseContextMenu(event); -#elif OS(LINUX) +#elif OS(LINUX) || OS(FREEBSD) if (event.button == WebMouseEvent::ButtonRight) mouseContextMenu(event); #endif @@ -402,7 +501,7 @@ void WebViewImpl::mouseUp(const WebMouseEvent& event) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) return; -#if OS(LINUX) +#if OS(LINUX) || OS(FREEBSD) // If the event was a middle click, attempt to copy text into the focused // frame. We execute this before we let the page have a go at the event // because the page may change what is focused during in its event handler. @@ -426,7 +525,7 @@ void WebViewImpl::mouseUp(const WebMouseEvent& event) IntPoint contentPoint = view->windowToContents(clickPoint); HitTestResult hitTestResult = focused->eventHandler()->hitTestResultAtPoint(contentPoint, false, false, ShouldHitTestScrollbars); // We don't want to send a paste when middle clicking a scroll bar or a - // link (which will navigate later in the code). The main scrollbars + // link (which will navigate later in the code). The main scrollbars // have to be handled separately. if (!hitTestResult.scrollbar() && !hitTestResult.isLiveLink() && focused && !view->scrollbarAtPoint(clickPoint)) { Editor* editor = focused->editor(); @@ -439,7 +538,6 @@ void WebViewImpl::mouseUp(const WebMouseEvent& event) } #endif - mouseCaptureLost(); mainFrameImpl()->frame()->eventHandler()->handleMouseReleaseEvent( PlatformMouseEventBuilder(mainFrameImpl()->frameView(), event)); @@ -451,10 +549,10 @@ void WebViewImpl::mouseUp(const WebMouseEvent& event) #endif } -void WebViewImpl::mouseWheel(const WebMouseWheelEvent& event) +bool WebViewImpl::mouseWheel(const WebMouseWheelEvent& event) { PlatformWheelEventBuilder platformEvent(mainFrameImpl()->frameView(), event); - mainFrameImpl()->frame()->eventHandler()->handleWheelEvent(platformEvent); + return mainFrameImpl()->frame()->eventHandler()->handleWheelEvent(platformEvent); } bool WebViewImpl::keyEvent(const WebKeyboardEvent& event) @@ -471,6 +569,10 @@ bool WebViewImpl::keyEvent(const WebKeyboardEvent& event) // event. m_suppressNextKeypressEvent = false; + // Give any select popup a chance at consuming the key event. + if (selectPopupHandleKeyEvent(event)) + return true; + // Give Autocomplete a chance to consume the key events it is interested in. if (autocompleteHandleKeyEvent(event)) return true; @@ -483,21 +585,21 @@ bool WebViewImpl::keyEvent(const WebKeyboardEvent& event) if (!handler) return keyEventDefault(event); -#if OS(WINDOWS) || OS(LINUX) +#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) const WebInputEvent::Type contextMenuTriggeringEventType = #if OS(WINDOWS) WebInputEvent::KeyUp; -#elif OS(LINUX) +#elif OS(LINUX) || OS(FREEBSD) WebInputEvent::RawKeyDown; #endif - if (((!event.modifiers && (event.windowsKeyCode == VKEY_APPS)) - || ((event.modifiers == WebInputEvent::ShiftKey) && (event.windowsKeyCode == VKEY_F10))) - && event.type == contextMenuTriggeringEventType) { + bool isUnmodifiedMenuKey = !(event.modifiers & WebInputEvent::InputModifiers) && event.windowsKeyCode == VKEY_APPS; + bool isShiftF10 = event.modifiers == WebInputEvent::ShiftKey && event.windowsKeyCode == VKEY_F10; + if ((isUnmodifiedMenuKey || isShiftF10) && event.type == contextMenuTriggeringEventType) { sendContextMenuEvent(event); return true; } -#endif +#endif // OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) // It's not clear if we should continue after detecting a capslock keypress. // I'll err on the side of continuing, which is the pre-existing behaviour. @@ -507,17 +609,30 @@ bool WebViewImpl::keyEvent(const WebKeyboardEvent& event) PlatformKeyboardEventBuilder evt(event); if (handler->keyEvent(evt)) { - if (WebInputEvent::RawKeyDown == event.type) - m_suppressNextKeypressEvent = true; + if (WebInputEvent::RawKeyDown == event.type) { + // Suppress the next keypress event unless the focused node is a plug-in node. + // (Flash needs these keypress events to handle non-US keyboards.) + Node* node = frame->document()->focusedNode(); + if (!node || !node->renderer() || !node->renderer()->isEmbeddedObject()) + m_suppressNextKeypressEvent = true; + } return true; } return keyEventDefault(event); } +bool WebViewImpl::selectPopupHandleKeyEvent(const WebKeyboardEvent& event) +{ + if (!m_selectPopup) + return false; + + return m_selectPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); +} + bool WebViewImpl::autocompleteHandleKeyEvent(const WebKeyboardEvent& event) { - if (!m_suggestionsPopupShowing + if (!m_autoFillPopupShowing // Home and End should be left to the text field to process. || event.windowsKeyCode == VKEY_HOME || event.windowsKeyCode == VKEY_END) @@ -525,7 +640,7 @@ bool WebViewImpl::autocompleteHandleKeyEvent(const WebKeyboardEvent& event) // Pressing delete triggers the removal of the selected suggestion from the DB. if (event.windowsKeyCode == VKEY_DELETE - && m_suggestionsPopup->selectedIndex() != -1) { + && m_autoFillPopup->selectedIndex() != -1) { Node* node = focusedWebCoreNode(); if (!node || (node->nodeType() != Node::ELEMENT_NODE)) { ASSERT_NOT_REACHED(); @@ -537,22 +652,25 @@ bool WebViewImpl::autocompleteHandleKeyEvent(const WebKeyboardEvent& event) return false; } - int selectedIndex = m_suggestionsPopup->selectedIndex(); - HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(element); - WebString name = inputElement->name(); - WebString value = m_autocompletePopupClient->itemText(selectedIndex); + int selectedIndex = m_autoFillPopup->selectedIndex(); + + if (!m_autoFillPopupClient->canRemoveSuggestionAtIndex(selectedIndex)) + return false; + + WebString name = WebInputElement(static_cast<HTMLInputElement*>(element)).nameForAutofill(); + WebString value = m_autoFillPopupClient->itemText(selectedIndex); m_client->removeAutofillSuggestions(name, value); // Update the entries in the currently showing popup to reflect the // deletion. - m_autocompletePopupClient->removeSuggestionAtIndex(selectedIndex); - refreshSuggestionsPopup(); + m_autoFillPopupClient->removeSuggestionAtIndex(selectedIndex); + refreshAutoFillPopup(); return false; } - if (!m_suggestionsPopup->isInterestedInEventForKey(event.windowsKeyCode)) + if (!m_autoFillPopup->isInterestedInEventForKey(event.windowsKeyCode)) return false; - if (m_suggestionsPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event))) { + if (m_autoFillPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event))) { // We need to ignore the next Char event after this otherwise pressing // enter when selecting an item in the menu will go to the page. if (WebInputEvent::RawKeyDown == event.type) @@ -604,62 +722,21 @@ bool WebViewImpl::charEvent(const WebKeyboardEvent& event) return true; } -// The WebViewImpl::SendContextMenuEvent function is based on the Webkit -// function -// bool WebView::handleContextMenuEvent(WPARAM wParam, LPARAM lParam) in -// webkit\webkit\win\WebView.cpp. The only significant change in this -// function is the code to convert from a Keyboard event to the Right -// Mouse button up event. -// -// This function is an ugly copy/paste and should be cleaned up when the -// WebKitWin version is cleaned: https://bugs.webkit.org/show_bug.cgi?id=20438 -#if OS(WINDOWS) || OS(LINUX) -// FIXME: implement on Mac -bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event) +#if ENABLE(TOUCH_EVENTS) +bool WebViewImpl::touchEvent(const WebTouchEvent& event) { - static const int kContextMenuMargin = 1; - Frame* mainFrameImpl = page()->mainFrame(); - FrameView* view = mainFrameImpl->view(); - if (!view) + if (!mainFrameImpl() || !mainFrameImpl()->frameView()) return false; - IntPoint coords(-1, -1); -#if OS(WINDOWS) - int rightAligned = ::GetSystemMetrics(SM_MENUDROPALIGNMENT); -#else - int rightAligned = 0; + PlatformTouchEventBuilder touchEventBuilder(mainFrameImpl()->frameView(), event); + return mainFrameImpl()->frame()->eventHandler()->handleTouchEvent(touchEventBuilder); +} #endif - IntPoint location; - - - Frame* focusedFrame = page()->focusController()->focusedOrMainFrame(); - Node* focusedNode = focusedFrame->document()->focusedNode(); - Position start = mainFrameImpl->selection()->selection().start(); - - if (focusedFrame->editor() && focusedFrame->editor()->canEdit() && start.node()) { - RenderObject* renderer = start.node()->renderer(); - if (!renderer) - return false; - - RefPtr<Range> selection = mainFrameImpl->selection()->toNormalizedRange(); - IntRect firstRect = mainFrameImpl->firstRectForRange(selection.get()); - - int x = rightAligned ? firstRect.right() : firstRect.x(); - location = IntPoint(x, firstRect.bottom()); - } else if (focusedNode) - location = focusedNode->getRect().bottomLeft(); - else { - location = IntPoint( - rightAligned ? view->contentsWidth() - kContextMenuMargin : kContextMenuMargin, - kContextMenuMargin); - } - - location = view->contentsToWindow(location); - // FIXME: The IntSize(0, -1) is a hack to get the hit-testing to result in - // the selected element. Ideally we'd have the position of a context menu - // event be separate from its target node. - coords = location + IntSize(0, -1); +#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) +// Mac has no way to open a context menu based on a keyboard event. +bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event) +{ // The contextMenuController() holds onto the last context menu that was // popped up on the page until a new one is created. We need to clear // this menu before propagating the event through the DOM so that we can @@ -668,17 +745,9 @@ bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event) // not run. page()->contextMenuController()->clearContextMenu(); - focusedFrame->view()->setCursor(pointerCursor()); - WebMouseEvent mouseEvent; - mouseEvent.button = WebMouseEvent::ButtonRight; - mouseEvent.x = coords.x(); - mouseEvent.y = coords.y(); - mouseEvent.type = WebInputEvent::MouseUp; - - PlatformMouseEventBuilder platformEvent(view, mouseEvent); - m_contextMenuAllowed = true; - bool handled = focusedFrame->eventHandler()->sendContextMenuEvent(platformEvent); + Frame* focusedFrame = page()->focusController()->focusedOrMainFrame(); + bool handled = focusedFrame->eventHandler()->sendContextMenuEventForKey(); m_contextMenuAllowed = false; return handled; } @@ -733,45 +802,59 @@ bool WebViewImpl::scrollViewWithKeyboard(int keyCode, int modifiers) { ScrollDirection scrollDirection; ScrollGranularity scrollGranularity; + if (!mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity)) + return false; + return propagateScroll(scrollDirection, scrollGranularity); +} +bool WebViewImpl::mapKeyCodeForScroll(int keyCode, + WebCore::ScrollDirection* scrollDirection, + WebCore::ScrollGranularity* scrollGranularity) +{ switch (keyCode) { case VKEY_LEFT: - scrollDirection = ScrollLeft; - scrollGranularity = ScrollByLine; + *scrollDirection = ScrollLeft; + *scrollGranularity = ScrollByLine; break; case VKEY_RIGHT: - scrollDirection = ScrollRight; - scrollGranularity = ScrollByLine; + *scrollDirection = ScrollRight; + *scrollGranularity = ScrollByLine; break; case VKEY_UP: - scrollDirection = ScrollUp; - scrollGranularity = ScrollByLine; + *scrollDirection = ScrollUp; + *scrollGranularity = ScrollByLine; break; case VKEY_DOWN: - scrollDirection = ScrollDown; - scrollGranularity = ScrollByLine; + *scrollDirection = ScrollDown; + *scrollGranularity = ScrollByLine; break; case VKEY_HOME: - scrollDirection = ScrollUp; - scrollGranularity = ScrollByDocument; + *scrollDirection = ScrollUp; + *scrollGranularity = ScrollByDocument; break; case VKEY_END: - scrollDirection = ScrollDown; - scrollGranularity = ScrollByDocument; + *scrollDirection = ScrollDown; + *scrollGranularity = ScrollByDocument; break; case VKEY_PRIOR: // page up - scrollDirection = ScrollUp; - scrollGranularity = ScrollByPage; + *scrollDirection = ScrollUp; + *scrollGranularity = ScrollByPage; break; case VKEY_NEXT: // page down - scrollDirection = ScrollDown; - scrollGranularity = ScrollByPage; + *scrollDirection = ScrollDown; + *scrollGranularity = ScrollByPage; break; default: return false; } - return propagateScroll(scrollDirection, scrollGranularity); + return true; +} + +void WebViewImpl::hideSelectPopup() +{ + if (m_selectPopup.get()) + m_selectPopup->hidePopup(); } bool WebViewImpl::propagateScroll(ScrollDirection scrollDirection, @@ -781,18 +864,39 @@ bool WebViewImpl::propagateScroll(ScrollDirection scrollDirection, if (!frame) return false; - bool scrollHandled = - frame->eventHandler()->scrollOverflow(scrollDirection, - scrollGranularity); + bool scrollHandled = frame->eventHandler()->scrollOverflow(scrollDirection, scrollGranularity); Frame* currentFrame = frame; while (!scrollHandled && currentFrame) { - scrollHandled = currentFrame->view()->scroll(scrollDirection, - scrollGranularity); + scrollHandled = currentFrame->view()->scroll(scrollDirection, scrollGranularity); currentFrame = currentFrame->tree()->parent(); } return scrollHandled; } +void WebViewImpl::popupOpened(WebCore::PopupContainer* popupContainer) +{ + if (popupContainer->popupType() == WebCore::PopupContainer::Select) { + ASSERT(!m_selectPopup); + m_selectPopup = popupContainer; + } +} + +void WebViewImpl::popupClosed(WebCore::PopupContainer* popupContainer) +{ + if (popupContainer->popupType() == WebCore::PopupContainer::Select) { + ASSERT(m_selectPopup.get()); + m_selectPopup = 0; + } +} + +void WebViewImpl::hideAutoFillPopup() +{ + if (m_autoFillPopupShowing) { + m_autoFillPopup->hidePopup(); + m_autoFillPopupShowing = false; + } +} + Frame* WebViewImpl::focusedWebCoreFrame() { return m_page.get() ? m_page->focusController()->focusedOrMainFrame() : 0; @@ -846,8 +950,20 @@ void WebViewImpl::resize(const WebSize& newSize) if (m_client) { WebRect damagedRect(0, 0, m_size.width, m_size.height); - m_client->didInvalidateRect(damagedRect); + if (isAcceleratedCompositingActive()) { +#if USE(ACCELERATED_COMPOSITING) + invalidateRootLayerRect(damagedRect); +#endif + } else + m_client->didInvalidateRect(damagedRect); + } + +#if USE(ACCELERATED_COMPOSITING) + if (m_layerRenderer && isAcceleratedCompositingActive()) { + m_layerRenderer->resizeOnscreenContent(IntSize(std::max(1, m_size.width), + std::max(1, m_size.height))); } +#endif } void WebViewImpl::layout() @@ -871,19 +987,99 @@ void WebViewImpl::layout() } } +#if USE(ACCELERATED_COMPOSITING) +void WebViewImpl::doPixelReadbackToCanvas(WebCanvas* canvas, const IntRect& rect) +{ + ASSERT(rect.right() <= m_layerRenderer->rootLayerTextureSize().width() + && rect.bottom() <= m_layerRenderer->rootLayerTextureSize().height()); + +#if PLATFORM(SKIA) + PlatformContextSkia context(canvas); + + // PlatformGraphicsContext is actually a pointer to PlatformContextSkia + GraphicsContext gc(reinterpret_cast<PlatformGraphicsContext*>(&context)); + int bitmapHeight = canvas->getDevice()->accessBitmap(false).height(); +#elif PLATFORM(CG) + GraphicsContext gc(canvas); + int bitmapHeight = CGBitmapContextGetHeight(reinterpret_cast<CGContextRef>(canvas)); +#else + notImplemented(); +#endif + // Compute rect to sample from inverted GPU buffer. + IntRect invertRect(rect.x(), bitmapHeight - rect.bottom(), rect.width(), rect.height()); + + OwnPtr<ImageBuffer> imageBuffer(ImageBuffer::create(rect.size())); + RefPtr<ImageData> imageData(ImageData::create(rect.width(), rect.height())); + if (imageBuffer.get() && imageData.get()) { + m_layerRenderer->getFramebufferPixels(imageData->data()->data()->data(), invertRect); + imageBuffer->putPremultipliedImageData(imageData.get(), IntRect(IntPoint(), rect.size()), IntPoint()); + gc.save(); + gc.translate(FloatSize(0.0f, bitmapHeight)); + gc.scale(FloatSize(1.0f, -1.0f)); + // Use invertRect in next line, so that transform above inverts it back to + // desired destination rect. + gc.drawImageBuffer(imageBuffer.get(), ColorSpaceDeviceRGB, invertRect.location()); + gc.restore(); + } +} +#endif + void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect) { - WebFrameImpl* webframe = mainFrameImpl(); - if (webframe) - webframe->paint(canvas, rect); + if (isAcceleratedCompositingActive()) { +#if USE(ACCELERATED_COMPOSITING) + doComposite(); + + // If a canvas was passed in, we use it to grab a copy of the + // freshly-rendered pixels. + if (canvas) { + // Clip rect to the confines of the rootLayerTexture. + IntRect resizeRect(rect); + resizeRect.intersect(IntRect(IntPoint(), m_layerRenderer->rootLayerTextureSize())); + doPixelReadbackToCanvas(canvas, resizeRect); + } +#endif + } else { + WebFrameImpl* webframe = mainFrameImpl(); + if (webframe) + webframe->paint(canvas, rect); + } +} + +void WebViewImpl::themeChanged() +{ + if (!page()) + return; + FrameView* view = page()->mainFrame()->view(); + + WebRect damagedRect(0, 0, m_size.width, m_size.height); + view->invalidateRect(damagedRect); +} + +void WebViewImpl::composite(bool finish) +{ +#if USE(ACCELERATED_COMPOSITING) + doComposite(); + + // Finish if requested. + if (finish) + m_layerRenderer->finish(); + + // Put result onscreen. + m_layerRenderer->present(); + + GraphicsContext3D* context = m_layerRenderer->context(); + if (context->getExtensions()->getGraphicsResetStatusARB() != GraphicsContext3D::NO_ERROR) + reallocateRenderer(); +#endif } -// FIXME: m_currentInputEvent should be removed once ChromeClient::show() can -// get the current-event information from WebCore. const WebInputEvent* WebViewImpl::m_currentInputEvent = 0; bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent) { + UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); + // If we've started a drag and drop operation, ignore input events until // we're done. if (m_doingDragAndDrop) @@ -892,14 +1088,41 @@ bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent) if (m_ignoreInputEvents) return true; - // FIXME: Remove m_currentInputEvent. - // This only exists to allow ChromeClient::show() to know which mouse button - // triggered a window.open event. - // Safari must perform a similar hack, ours is in our WebKit glue layer - // theirs is in the application. This should go when WebCore can be fixed - // to pass more event information to ChromeClient::show() m_currentInputEvent = &inputEvent; + if (m_mouseCaptureNode.get() && WebInputEvent::isMouseEventType(inputEvent.type)) { + // Save m_mouseCaptureNode since mouseCaptureLost() will clear it. + RefPtr<Node> node = m_mouseCaptureNode; + + // Not all platforms call mouseCaptureLost() directly. + if (inputEvent.type == WebInputEvent::MouseUp) + mouseCaptureLost(); + + AtomicString eventType; + switch (inputEvent.type) { + case WebInputEvent::MouseMove: + eventType = eventNames().mousemoveEvent; + break; + case WebInputEvent::MouseLeave: + eventType = eventNames().mouseoutEvent; + break; + case WebInputEvent::MouseDown: + eventType = eventNames().mousedownEvent; + break; + case WebInputEvent::MouseUp: + eventType = eventNames().mouseupEvent; + break; + default: + ASSERT_NOT_REACHED(); + } + + node->dispatchMouseEvent( + PlatformMouseEventBuilder(mainFrameImpl()->frameView(), *static_cast<const WebMouseEvent*>(&inputEvent)), + eventType, static_cast<const WebMouseEvent*>(&inputEvent)->clickCount); + m_currentInputEvent = 0; + return true; + } + bool handled = true; // FIXME: WebKit seems to always return false on mouse events processing @@ -915,7 +1138,7 @@ bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent) break; case WebInputEvent::MouseWheel: - mouseWheel(*static_cast<const WebMouseWheelEvent*>(&inputEvent)); + handled = mouseWheel(*static_cast<const WebMouseWheelEvent*>(&inputEvent)); break; case WebInputEvent::MouseDown: @@ -936,6 +1159,15 @@ bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent) handled = charEvent(*static_cast<const WebKeyboardEvent*>(&inputEvent)); break; +#if ENABLE(TOUCH_EVENTS) + case WebInputEvent::TouchStart: + case WebInputEvent::TouchMove: + case WebInputEvent::TouchEnd: + case WebInputEvent::TouchCancel: + handled = touchEvent(*static_cast<const WebTouchEvent*>(&inputEvent)); + break; +#endif + default: handled = false; } @@ -947,6 +1179,7 @@ bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent) void WebViewImpl::mouseCaptureLost() { + m_mouseCaptureNode = 0; } void WebViewImpl::setFocus(bool enable) @@ -981,7 +1214,8 @@ void WebViewImpl::setFocus(bool enable) } m_imeAcceptEvents = true; } else { - hideSuggestionsPopup(); + hideAutoFillPopup(); + hideSelectPopup(); // Clear focus on the currently focused frame if any. if (!m_page.get()) @@ -1002,11 +1236,11 @@ void WebViewImpl::setFocus(bool enable) } } -bool WebViewImpl::handleCompositionEvent(WebCompositionCommand command, - int cursorPosition, - int targetStart, - int targetEnd, - const WebString& imeString) +bool WebViewImpl::setComposition( + const WebString& text, + const WebVector<WebCompositionUnderline>& underlines, + int selectionStart, + int selectionEnd) { Frame* focused = focusedWebCoreFrame(); if (!focused || !m_imeAcceptEvents) @@ -1014,13 +1248,12 @@ bool WebViewImpl::handleCompositionEvent(WebCompositionCommand command, Editor* editor = focused->editor(); if (!editor) return false; - if (!editor->canEdit()) { - // The input focus has been moved to another WebWidget object. - // We should use this |editor| object only to complete the ongoing - // composition. - if (!editor->hasComposition()) - return false; - } + + // The input focus has been moved to another WebWidget object. + // We should use this |editor| object only to complete the ongoing + // composition. + if (!editor->canEdit() && !editor->hasComposition()) + return false; // We should verify the parent node of this IME composition node are // editable because JavaScript may delete a parent node of the composition @@ -1033,7 +1266,9 @@ bool WebViewImpl::handleCompositionEvent(WebCompositionCommand command, return false; } - if (command == WebCompositionCommandDiscard) { + // If we're not going to fire a keypress event, then the keydown event was + // canceled. In that case, cancel any existing composition. + if (text.isEmpty() || m_suppressNextKeypressEvent) { // A browser process sent an IPC message which does not contain a valid // string, which means an ongoing composition has been canceled. // If the ongoing composition has been canceled, replace the ongoing @@ -1041,81 +1276,102 @@ bool WebViewImpl::handleCompositionEvent(WebCompositionCommand command, String emptyString; Vector<CompositionUnderline> emptyUnderlines; editor->setComposition(emptyString, emptyUnderlines, 0, 0); - } else { - // A browser process sent an IPC message which contains a string to be - // displayed in this Editor object. - // To display the given string, set the given string to the - // m_compositionNode member of this Editor object and display it. - if (targetStart < 0) - targetStart = 0; - if (targetEnd < 0) - targetEnd = static_cast<int>(imeString.length()); - String compositionString(imeString); - // Create custom underlines. - // To emphasize the selection, the selected region uses a solid black - // for its underline while other regions uses a pale gray for theirs. - Vector<CompositionUnderline> underlines(3); - underlines[0].startOffset = 0; - underlines[0].endOffset = targetStart; - underlines[0].thick = true; - underlines[0].color.setRGB(0xd3, 0xd3, 0xd3); - underlines[1].startOffset = targetStart; - underlines[1].endOffset = targetEnd; - underlines[1].thick = true; - underlines[1].color.setRGB(0x00, 0x00, 0x00); - underlines[2].startOffset = targetEnd; - underlines[2].endOffset = static_cast<int>(imeString.length()); - underlines[2].thick = true; - underlines[2].color.setRGB(0xd3, 0xd3, 0xd3); - // When we use custom underlines, WebKit ("InlineTextBox.cpp" Line 282) - // prevents from writing a text in between 'selectionStart' and - // 'selectionEnd' somehow. - // Therefore, we use the 'cursorPosition' for these arguments so that - // there are not any characters in the above region. - editor->setComposition(compositionString, underlines, - cursorPosition, cursorPosition); - // The given string is a result string, which means the ongoing - // composition has been completed. I have to call the - // Editor::confirmCompletion() and complete this composition. - if (command == WebCompositionCommandConfirm) - editor->confirmComposition(); + return text.isEmpty(); } + // When the range of composition underlines overlap with the range between + // selectionStart and selectionEnd, WebKit somehow won't paint the selection + // at all (see InlineTextBox::paint() function in InlineTextBox.cpp). + // But the selection range actually takes effect. + editor->setComposition(String(text), + CompositionUnderlineVectorBuilder(underlines), + selectionStart, selectionEnd); + return editor->hasComposition(); } -bool WebViewImpl::queryCompositionStatus(bool* enableIME, WebRect* caretRect) +bool WebViewImpl::confirmComposition() +{ + Frame* focused = focusedWebCoreFrame(); + if (!focused || !m_imeAcceptEvents) + return false; + Editor* editor = focused->editor(); + if (!editor || !editor->hasComposition()) + return false; + + // We should verify the parent node of this IME composition node are + // editable because JavaScript may delete a parent node of the composition + // node. In this case, WebKit crashes while deleting texts from the parent + // node, which doesn't exist any longer. + PassRefPtr<Range> range = editor->compositionRange(); + if (range) { + const Node* node = range->startPosition().node(); + if (!node || !node->isContentEditable()) + return false; + } + + editor->confirmComposition(); + return true; +} + +WebTextInputType WebViewImpl::textInputType() { - // Store whether the selected node needs IME and the caret rectangle. - // This process consists of the following four steps: - // 1. Retrieve the selection controller of the focused frame; - // 2. Retrieve the caret rectangle from the controller; - // 3. Convert the rectangle, which is relative to the parent view, to the - // one relative to the client window, and; - // 4. Store the converted rectangle. + WebTextInputType type = WebTextInputTypeNone; const Frame* focused = focusedWebCoreFrame(); if (!focused) - return false; + return type; const Editor* editor = focused->editor(); if (!editor || !editor->canEdit()) - return false; + return type; SelectionController* controller = focused->selection(); if (!controller) - return false; + return type; const Node* node = controller->start().node(); if (!node) - return false; + return type; + + // FIXME: Support more text input types when necessary, eg. Number, + // Date, Email, URL, etc. + if (controller->isInPasswordField()) + type = WebTextInputTypePassword; + else if (node->shouldUseInputMethod()) + type = WebTextInputTypeText; - *enableIME = node->shouldUseInputMethod() && !controller->isInPasswordField(); - const FrameView* view = node->document()->view(); + return type; +} + +WebRect WebViewImpl::caretOrSelectionBounds() +{ + WebRect rect; + const Frame* focused = focusedWebCoreFrame(); + if (!focused) + return rect; + + SelectionController* controller = focused->selection(); + if (!controller) + return rect; + + const FrameView* view = focused->view(); if (!view) - return false; + return rect; - *caretRect = view->contentsToWindow(controller->absoluteCaretBounds()); - return true; + const Node* node = controller->start().node(); + if (!node || !node->renderer()) + return rect; + + if (controller->isCaret()) + rect = view->contentsToWindow(controller->absoluteCaretBounds()); + else if (controller->isRange()) { + node = controller->end().node(); + if (!node || !node->renderer()) + return rect; + RefPtr<Range> range = controller->toNormalizedRange(); + rect = view->contentsToWindow(focused->editor()->firstRectForRange(range.get())); + } + return rect; } void WebViewImpl::setTextDirection(WebTextDirection direction) @@ -1151,6 +1407,15 @@ void WebViewImpl::setTextDirection(WebTextDirection direction) } } +bool WebViewImpl::isAcceleratedCompositingActive() const +{ +#if USE(ACCELERATED_COMPOSITING) + return m_isAcceleratedCompositingActive; +#else + return false; +#endif +} + // WebView -------------------------------------------------------------------- WebSettings* WebViewImpl::settings() @@ -1166,7 +1431,7 @@ WebString WebViewImpl::pageEncoding() const if (!m_page.get()) return WebString(); - return m_page->mainFrame()->loader()->encoding(); + return m_page->mainFrame()->loader()->writer()->encoding(); } void WebViewImpl::setPageEncoding(const WebString& encodingName) @@ -1191,7 +1456,7 @@ bool WebViewImpl::dispatchBeforeUnloadEvent() if (!frame) return true; - return frame->shouldClose(); + return frame->loader()->shouldClose(); } void WebViewImpl::dispatchUnloadEvent() @@ -1249,6 +1514,10 @@ void WebViewImpl::setInitialFocus(bool reverse) keyboardEvent.windowsKeyCode = 0x09; PlatformKeyboardEventBuilder platformEvent(keyboardEvent); RefPtr<KeyboardEvent> webkitEvent = KeyboardEvent::create(platformEvent, 0); + + Frame* frame = page()->focusController()->focusedOrMainFrame(); + if (Document* document = frame->document()) + document->setFocusedNode(0); page()->focusController()->setInitialFocus( reverse ? FocusDirectionBackward : FocusDirectionForward, webkitEvent.get()); @@ -1288,25 +1557,71 @@ void WebViewImpl::clearFocusedNode() } } -int WebViewImpl::zoomLevel() +void WebViewImpl::scrollFocusedNodeIntoView() +{ + Node* focusedNode = focusedWebCoreNode(); + if (focusedNode && focusedNode->isElementNode()) { + Element* elementNode = static_cast<Element*>(focusedNode); + elementNode->scrollIntoViewIfNeeded(true); + } +} + +double WebViewImpl::zoomLevel() { return m_zoomLevel; } -int WebViewImpl::setZoomLevel(bool textOnly, int zoomLevel) +double WebViewImpl::setZoomLevel(bool textOnly, double zoomLevel) { - float zoomFactor = static_cast<float>( - std::max(std::min(std::pow(textSizeMultiplierRatio, zoomLevel), - maxTextSizeMultiplier), - minTextSizeMultiplier)); - Frame* frame = mainFrameImpl()->frame(); - if (zoomFactor != frame->zoomFactor()) { + if (zoomLevel < m_minimumZoomLevel) + m_zoomLevel = m_minimumZoomLevel; + else if (zoomLevel > m_maximumZoomLevel) + m_zoomLevel = m_maximumZoomLevel; + else m_zoomLevel = zoomLevel; - frame->setZoomFactor(zoomFactor, textOnly); + + Frame* frame = mainFrameImpl()->frame(); + WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(frame); + if (pluginContainer) + pluginContainer->plugin()->setZoomLevel(m_zoomLevel, textOnly); + else { + double zoomFactor = zoomLevelToZoomFactor(m_zoomLevel); + if (textOnly) + frame->setPageAndTextZoomFactors(1, zoomFactor); + else + frame->setPageAndTextZoomFactors(zoomFactor, 1); } return m_zoomLevel; } +void WebViewImpl::zoomLimitsChanged(double minimumZoomLevel, + double maximumZoomLevel) +{ + m_minimumZoomLevel = minimumZoomLevel; + m_maximumZoomLevel = maximumZoomLevel; + m_client->zoomLimitsChanged(m_minimumZoomLevel, m_maximumZoomLevel); +} + +void WebViewImpl::fullFramePluginZoomLevelChanged(double zoomLevel) +{ + if (zoomLevel == m_zoomLevel) + return; + + m_zoomLevel = std::max(std::min(zoomLevel, m_maximumZoomLevel), m_minimumZoomLevel); + m_client->zoomLevelChanged(); +} + +double WebView::zoomLevelToZoomFactor(double zoomLevel) +{ + return std::pow(textSizeMultiplierRatio, zoomLevel); +} + +double WebView::zoomFactorToZoomLevel(double factor) +{ + // Since factor = 1.2^level, level = log(factor) / log(1.2) + return log(factor) / log(textSizeMultiplierRatio); +} + void WebViewImpl::performMediaPlayerAction(const WebMediaPlayerAction& action, const WebPoint& location) { @@ -1331,6 +1646,9 @@ void WebViewImpl::performMediaPlayerAction(const WebMediaPlayerAction& action, case WebMediaPlayerAction::Loop: mediaElement->setLoop(action.enable); break; + case WebMediaPlayerAction::Controls: + mediaElement->setControls(action.enable); + break; default: ASSERT_NOT_REACHED(); } @@ -1368,6 +1686,15 @@ void WebViewImpl::dragSourceEndedAt( false, 0); m_page->mainFrame()->eventHandler()->dragSourceEndedAt(pme, static_cast<DragOperation>(operation)); + m_dragScrollTimer->stop(); +} + +void WebViewImpl::dragSourceMovedTo( + const WebPoint& clientPoint, + const WebPoint& screenPoint, + WebDragOperation operation) +{ + m_dragScrollTimer->triggerScroll(mainFrameImpl()->frameView(), clientPoint); } void WebViewImpl::dragSourceSystemDragEnded() @@ -1392,26 +1719,22 @@ WebDragOperation WebViewImpl::dragTargetDragEnter( m_dragIdentity = identity; m_operationsAllowed = operationsAllowed; - DragData dragData( - m_currentDragData.get(), - clientPoint, - screenPoint, - static_cast<DragOperation>(operationsAllowed)); + return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragEnter); +} - m_dropEffect = DropEffectDefault; - m_dragTargetDispatch = true; - DragOperation effect = m_page->dragController()->dragEntered(&dragData); - // Mask the operation against the drag source's allowed operations. - if ((effect & dragData.draggingSourceOperationMask()) != effect) - effect = DragOperationNone; - m_dragTargetDispatch = false; +WebDragOperation WebViewImpl::dragTargetDragEnterNew( + int identity, + const WebPoint& clientPoint, + const WebPoint& screenPoint, + WebDragOperationsMask operationsAllowed) +{ + ASSERT(!m_currentDragData.get()); - if (m_dropEffect != DropEffectDefault) { - m_dragOperation = (m_dropEffect != DropEffectNone) ? WebDragOperationCopy - : WebDragOperationNone; - } else - m_dragOperation = static_cast<WebDragOperation>(effect); - return m_dragOperation; + m_currentDragData = ChromiumDataObject::createReadable(Clipboard::DragAndDrop); + m_dragIdentity = identity; + m_operationsAllowed = operationsAllowed; + + return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragEnter); } WebDragOperation WebViewImpl::dragTargetDragOver( @@ -1419,29 +1742,9 @@ WebDragOperation WebViewImpl::dragTargetDragOver( const WebPoint& screenPoint, WebDragOperationsMask operationsAllowed) { - ASSERT(m_currentDragData.get()); - m_operationsAllowed = operationsAllowed; - DragData dragData( - m_currentDragData.get(), - clientPoint, - screenPoint, - static_cast<DragOperation>(operationsAllowed)); - - m_dropEffect = DropEffectDefault; - m_dragTargetDispatch = true; - DragOperation effect = m_page->dragController()->dragUpdated(&dragData); - // Mask the operation against the drag source's allowed operations. - if ((effect & dragData.draggingSourceOperationMask()) != effect) - effect = DragOperationNone; - m_dragTargetDispatch = false; - if (m_dropEffect != DropEffectDefault) { - m_dragOperation = (m_dropEffect != DropEffectNone) ? WebDragOperationCopy - : WebDragOperationNone; - } else - m_dragOperation = static_cast<WebDragOperation>(effect); - return m_dragOperation; + return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragOver); } void WebViewImpl::dragTargetDragLeave() @@ -1495,6 +1798,7 @@ void WebViewImpl::dragTargetDrop(const WebPoint& clientPoint, m_dropEffect = DropEffectDefault; m_dragOperation = WebDragOperationNone; m_dragIdentity = 0; + m_dragScrollTimer->stop(); } int WebViewImpl::dragIdentity() @@ -1504,7 +1808,42 @@ int WebViewImpl::dragIdentity() return 0; } -unsigned long WebViewImpl::createUniqueIdentifierForRequest() { +WebDragOperation WebViewImpl::dragTargetDragEnterOrOver(const WebPoint& clientPoint, const WebPoint& screenPoint, DragAction dragAction) +{ + ASSERT(m_currentDragData.get()); + + DragData dragData( + m_currentDragData.get(), + clientPoint, + screenPoint, + static_cast<DragOperation>(m_operationsAllowed)); + + m_dropEffect = DropEffectDefault; + m_dragTargetDispatch = true; + DragOperation effect = dragAction == DragEnter ? m_page->dragController()->dragEntered(&dragData) + : m_page->dragController()->dragUpdated(&dragData); + // Mask the operation against the drag source's allowed operations. + if (!(effect & dragData.draggingSourceOperationMask())) + effect = DragOperationNone; + m_dragTargetDispatch = false; + + if (m_dropEffect != DropEffectDefault) { + m_dragOperation = (m_dropEffect != DropEffectNone) ? WebDragOperationCopy + : WebDragOperationNone; + } else + m_dragOperation = static_cast<WebDragOperation>(effect); + + if (dragAction == DragOver) + m_dragScrollTimer->triggerScroll(mainFrameImpl()->frameView(), clientPoint); + else + m_dragScrollTimer->stop(); + + + return m_dragOperation; +} + +unsigned long WebViewImpl::createUniqueIdentifierForRequest() +{ if (m_page) return m_page->progress()->createUniqueIdentifier(); return 0; @@ -1537,15 +1876,24 @@ void WebViewImpl::setInspectorSettings(const WebString& settings) m_inspectorSettings = settings; } -WebDevToolsAgent* WebViewImpl::devToolsAgent() +bool WebViewImpl::inspectorSetting(const WebString& key, WebString* value) const { - return m_devToolsAgent.get(); + if (!m_inspectorSettingsMap->contains(key)) + return false; + *value = m_inspectorSettingsMap->get(key); + return true; } -void WebViewImpl::setDevToolsAgent(WebDevToolsAgent* devToolsAgent) +void WebViewImpl::setInspectorSetting(const WebString& key, + const WebString& value) { - ASSERT(!m_devToolsAgent.get()); // May only set once! - m_devToolsAgent.set(static_cast<WebDevToolsAgentPrivate*>(devToolsAgent)); + m_inspectorSettingsMap->set(key, value); + client()->didUpdateInspectorSetting(key, value); +} + +WebDevToolsAgent* WebViewImpl::devToolsAgent() +{ + return m_devToolsAgent.get(); } WebAccessibilityObject WebViewImpl::accessibilityObject() @@ -1558,25 +1906,31 @@ WebAccessibilityObject WebViewImpl::accessibilityObject() document->axObjectCache()->getOrCreate(document->renderer())); } -void WebViewImpl::applyAutofillSuggestions( +void WebViewImpl::applyAutoFillSuggestions( const WebNode& node, - const WebVector<WebString>& suggestions, - int defaultSuggestionIndex) + const WebVector<WebString>& names, + const WebVector<WebString>& labels, + const WebVector<int>& uniqueIDs, + int separatorIndex) { - applyAutocompleteSuggestions(node, suggestions, defaultSuggestionIndex); + WebVector<WebString> icons(names.size()); + applyAutoFillSuggestions(node, names, labels, icons, uniqueIDs, separatorIndex); } void WebViewImpl::applyAutoFillSuggestions( const WebNode& node, const WebVector<WebString>& names, const WebVector<WebString>& labels, - int defaultSuggestionIndex) + const WebVector<WebString>& icons, + const WebVector<int>& uniqueIDs, + int separatorIndex) { ASSERT(names.size() == labels.size()); - ASSERT(defaultSuggestionIndex < static_cast<int>(names.size())); + ASSERT(names.size() == uniqueIDs.size()); + ASSERT(separatorIndex < static_cast<int>(names.size())); if (names.isEmpty()) { - hideSuggestionsPopup(); + hideAutoFillPopup(); return; } @@ -1585,7 +1939,7 @@ void WebViewImpl::applyAutoFillSuggestions( // focused node, then we have nothing to do. FIXME: also check the // caret is at the end and that the text has not changed. if (!focusedNode || focusedNode != PassRefPtr<Node>(node)) { - hideSuggestionsPopup(); + hideAutoFillPopup(); return; } @@ -1597,98 +1951,51 @@ void WebViewImpl::applyAutoFillSuggestions( if (!m_autoFillPopupClient.get()) m_autoFillPopupClient.set(new AutoFillPopupMenuClient); - m_autoFillPopupClient->initialize(inputElem, names, labels, - defaultSuggestionIndex); - - if (m_suggestionsPopupClient != m_autoFillPopupClient.get()) { - hideSuggestionsPopup(); - m_suggestionsPopupClient = m_autoFillPopupClient.get(); - } + m_autoFillPopupClient->initialize( + inputElem, names, labels, icons, uniqueIDs, separatorIndex); if (!m_autoFillPopup.get()) { - m_autoFillPopup = PopupContainer::create(m_suggestionsPopupClient, - suggestionsPopupSettings); + m_autoFillPopup = PopupContainer::create(m_autoFillPopupClient.get(), + PopupContainer::Suggestion, + autoFillPopupSettings); } - if (m_suggestionsPopup != m_autoFillPopup.get()) - m_suggestionsPopup = m_autoFillPopup.get(); - - if (m_suggestionsPopupShowing) { - m_autoFillPopupClient->setSuggestions(names, labels); - refreshSuggestionsPopup(); + if (m_autoFillPopupShowing) { + refreshAutoFillPopup(); } else { - m_suggestionsPopup->show(focusedNode->getRect(), - focusedNode->ownerDocument()->view(), 0); - m_suggestionsPopupShowing = true; + m_autoFillPopup->show(focusedNode->getRect(), focusedNode->ownerDocument()->view(), 0); + m_autoFillPopupShowing = true; } + + // DEPRECATED: This special mode will go away once AutoFill and Autocomplete + // merge is complete. + if (m_autoFillPopupClient) + m_autoFillPopupClient->setAutocompleteMode(false); } +// DEPRECATED: replacing with applyAutoFillSuggestions. void WebViewImpl::applyAutocompleteSuggestions( const WebNode& node, const WebVector<WebString>& suggestions, int defaultSuggestionIndex) { - ASSERT(defaultSuggestionIndex < static_cast<int>(suggestions.size())); + WebVector<WebString> names(suggestions.size()); + WebVector<WebString> labels(suggestions.size()); + WebVector<WebString> icons(suggestions.size()); + WebVector<int> uniqueIDs(suggestions.size()); - if (!m_page.get() || suggestions.isEmpty()) { - hideSuggestionsPopup(); - return; - } + for (size_t i = 0; i < suggestions.size(); ++i) + names[i] = suggestions[i]; - RefPtr<Node> focusedNode = focusedWebCoreNode(); - // If the node for which we queried the Autocomplete suggestions is not the - // focused node, then we have nothing to do. FIXME: also check the - // caret is at the end and that the text has not changed. - if (!focusedNode || focusedNode != PassRefPtr<Node>(node)) { - hideSuggestionsPopup(); - return; - } - - HTMLInputElement* inputElem = - static_cast<HTMLInputElement*>(focusedNode.get()); - - // The first time the Autocomplete is shown we'll create the client and the - // popup. - if (!m_autocompletePopupClient.get()) - m_autocompletePopupClient.set(new AutocompletePopupMenuClient); - - m_autocompletePopupClient->initialize(inputElem, suggestions, - defaultSuggestionIndex); - - if (m_suggestionsPopupClient != m_autocompletePopupClient.get()) { - hideSuggestionsPopup(); - m_suggestionsPopupClient = m_autocompletePopupClient.get(); - } - - if (!m_autocompletePopup.get()) { - m_autocompletePopup = PopupContainer::create(m_suggestionsPopupClient, - suggestionsPopupSettings); - } - - if (m_suggestionsPopup != m_autocompletePopup.get()) - m_suggestionsPopup = m_autocompletePopup.get(); - - if (m_suggestionsPopupShowing) { - m_autocompletePopupClient->setSuggestions(suggestions); - refreshSuggestionsPopup(); - } else { - m_suggestionsPopup->show(focusedNode->getRect(), - focusedNode->ownerDocument()->view(), 0); - m_suggestionsPopupShowing = true; - } + applyAutoFillSuggestions(node, names, labels, icons, uniqueIDs, -1); + if (m_autoFillPopupClient) + m_autoFillPopupClient->setAutocompleteMode(true); } -void WebViewImpl::hideAutofillPopup() +void WebViewImpl::hidePopups() { - hideSuggestionsPopup(); -} - -void WebViewImpl::hideSuggestionsPopup() -{ - if (m_suggestionsPopupShowing) { - m_suggestionsPopup->hidePopup(); - m_suggestionsPopupShowing = false; - } + hideSelectPopup(); + hideAutoFillPopup(); } void WebViewImpl::performCustomContextMenuAction(unsigned action) @@ -1744,11 +2051,16 @@ bool WebViewImpl::isActive() const return (page() && page()->focusController()) ? page()->focusController()->isActive() : false; } +void WebViewImpl::setDomainRelaxationForbidden(bool forbidden, const WebString& scheme) +{ + SecurityOrigin::setDomainRelaxationForbiddenForURLScheme(forbidden, String(scheme)); +} + void WebViewImpl::setScrollbarColors(unsigned inactiveColor, unsigned activeColor, unsigned trackColor) { -#if OS(LINUX) - RenderThemeChromiumLinux::setScrollbarColors(inactiveColor, +#if OS(LINUX) || OS(FREEBSD) + PlatformThemeChromiumGtk::setScrollbarColors(inactiveColor, activeColor, trackColor); #endif @@ -1758,7 +2070,7 @@ void WebViewImpl::setSelectionColors(unsigned activeBackgroundColor, unsigned activeForegroundColor, unsigned inactiveBackgroundColor, unsigned inactiveForegroundColor) { -#if OS(LINUX) +#if OS(LINUX) || OS(FREEBSD) RenderThemeChromiumLinux::setSelectionColors(activeBackgroundColor, activeForegroundColor, inactiveBackgroundColor, @@ -1767,15 +2079,45 @@ void WebViewImpl::setSelectionColors(unsigned activeBackgroundColor, #endif } -void WebViewImpl::addUserScript(const WebString& sourceCode, bool runAtStart) +void WebView::addUserScript(const WebString& sourceCode, + const WebVector<WebString>& patternsIn, + WebView::UserScriptInjectAt injectAt, + WebView::UserContentInjectIn injectIn) +{ + OwnPtr<Vector<String> > patterns(new Vector<String>); + for (size_t i = 0; i < patternsIn.size(); ++i) + patterns->append(patternsIn[i]); + + PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName); + RefPtr<DOMWrapperWorld> world(DOMWrapperWorld::create()); + pageGroup->addUserScriptToWorld(world.get(), sourceCode, WebURL(), patterns.release(), 0, + static_cast<UserScriptInjectionTime>(injectAt), + static_cast<UserContentInjectedFrames>(injectIn)); +} + +void WebView::addUserStyleSheet(const WebString& sourceCode, + const WebVector<WebString>& patternsIn, + WebView::UserContentInjectIn injectIn, + WebView::UserStyleInjectionTime injectionTime) { + OwnPtr<Vector<String> > patterns(new Vector<String>); + for (size_t i = 0; i < patternsIn.size(); ++i) + patterns->append(patternsIn[i]); + PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName); RefPtr<DOMWrapperWorld> world(DOMWrapperWorld::create()); - pageGroup->addUserScriptToWorld(world.get(), sourceCode, WebURL(), 0, 0, - runAtStart ? InjectAtDocumentStart : InjectAtDocumentEnd); + + // FIXME: Current callers always want the level to be "author". It probably makes sense to let + // callers specify this though, since in other cases the caller will probably want "user" level. + // + // FIXME: It would be nice to populate the URL correctly, instead of passing an empty URL. + pageGroup->addUserStyleSheetToWorld(world.get(), sourceCode, WebURL(), patterns.release(), 0, + static_cast<UserContentInjectedFrames>(injectIn), + UserStyleAuthorLevel, + static_cast<WebCore::UserStyleInjectionTime>(injectionTime)); } -void WebViewImpl::removeAllUserContent() +void WebView::removeAllUserContent() { PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName); pageGroup->removeAllUserContent(); @@ -1794,12 +2136,17 @@ void WebViewImpl::didCommitLoad(bool* isNewNavigation) m_observedNewNavigation = false; } +bool WebViewImpl::useExternalPopupMenus() +{ + return shouldUseExternalPopupMenus; +} + bool WebViewImpl::navigationPolicyFromMouseEvent(unsigned short button, bool ctrl, bool shift, bool alt, bool meta, WebNavigationPolicy* policy) { -#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) +#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) || OS(SOLARIS) const bool newTabModifier = (button == 1) || ctrl; #elif OS(DARWIN) const bool newTabModifier = (button == 1) || meta; @@ -1822,15 +2169,16 @@ bool WebViewImpl::navigationPolicyFromMouseEvent(unsigned short button, return true; } -void WebViewImpl::startDragging(const WebPoint& eventPos, - const WebDragData& dragData, - WebDragOperationsMask mask) +void WebViewImpl::startDragging(const WebDragData& dragData, + WebDragOperationsMask mask, + const WebImage& dragImage, + const WebPoint& dragImageOffset) { if (!m_client) return; ASSERT(!m_doingDragAndDrop); m_doingDragAndDrop = true; - m_client->startDragging(eventPos, dragData, mask); + m_client->startDragging(dragData, mask, dragImage, dragImageOffset); } void WebViewImpl::setCurrentHistoryItem(HistoryItem* item) @@ -1866,24 +2214,25 @@ NotificationPresenterImpl* WebViewImpl::notificationPresenterImpl() } #endif -void WebViewImpl::refreshSuggestionsPopup() +void WebViewImpl::refreshAutoFillPopup() { - ASSERT(m_suggestionsPopupShowing); + ASSERT(m_autoFillPopupShowing); // Hide the popup if it has become empty. - if (!m_autocompletePopupClient->listSize()) { - hideSuggestionsPopup(); + if (!m_autoFillPopupClient->listSize()) { + hideAutoFillPopup(); return; } - IntRect oldBounds = m_suggestionsPopup->boundsRect(); - m_suggestionsPopup->refresh(); - IntRect newBounds = m_suggestionsPopup->boundsRect(); + IntRect oldBounds = m_autoFillPopup->boundsRect(); + m_autoFillPopup->refresh(); + IntRect newBounds = m_autoFillPopup->boundsRect(); // Let's resize the backing window if necessary. if (oldBounds != newBounds) { WebPopupMenuImpl* popupMenu = - static_cast<WebPopupMenuImpl*>(m_suggestionsPopup->client()); - popupMenu->client()->setWindowRect(newBounds); + static_cast<WebPopupMenuImpl*>(m_autoFillPopup->client()); + if (popupMenu) + popupMenu->client()->setWindowRect(newBounds); } } @@ -1916,4 +2265,285 @@ bool WebViewImpl::tabsToLinks() const return m_tabsToLinks; } +#if USE(ACCELERATED_COMPOSITING) +bool WebViewImpl::allowsAcceleratedCompositing() +{ + return !m_compositorCreationFailed; +} + +void WebViewImpl::setRootGraphicsLayer(WebCore::PlatformLayer* layer) +{ + setIsAcceleratedCompositingActive(layer ? true : false); + if (m_layerRenderer) + m_layerRenderer->setRootLayer(layer); + + IntRect damagedRect(0, 0, m_size.width, m_size.height); + if (m_isAcceleratedCompositingActive) + invalidateRootLayerRect(damagedRect); + else + m_client->didInvalidateRect(damagedRect); +} + +void WebViewImpl::setRootLayerNeedsDisplay() +{ + m_client->scheduleComposite(); +} + + +void WebViewImpl::scrollRootLayerRect(const IntSize& scrollDelta, const IntRect& clipRect) +{ + ASSERT(m_layerRenderer); + // Compute the damage rect in viewport space. + WebFrameImpl* webframe = mainFrameImpl(); + if (!webframe) + return; + FrameView* view = webframe->frameView(); + if (!view) + return; + + IntRect contentRect = view->visibleContentRect(false); + IntRect screenRect = view->contentsToWindow(contentRect); + + // We support fast scrolling in one direction at a time. + if (scrollDelta.width() && scrollDelta.height()) { + invalidateRootLayerRect(WebRect(screenRect)); + return; + } + + // Compute the region we will expose by scrolling. We use the + // content rect for invalidation. Using this space for damage + // rects allows us to intermix invalidates with scrolls. + IntRect damagedContentsRect; + if (scrollDelta.width()) { + int dx = scrollDelta.width(); + damagedContentsRect.setY(screenRect.y()); + damagedContentsRect.setHeight(screenRect.height()); + if (dx > 0) { + damagedContentsRect.setX(screenRect.x()); + damagedContentsRect.setWidth(dx); + } else { + damagedContentsRect.setX(screenRect.right() + dx); + damagedContentsRect.setWidth(-dx); + } + } else { + int dy = scrollDelta.height(); + damagedContentsRect.setX(screenRect.x()); + damagedContentsRect.setWidth(screenRect.width()); + if (dy > 0) { + damagedContentsRect.setY(screenRect.y()); + damagedContentsRect.setHeight(dy); + } else { + damagedContentsRect.setY(screenRect.bottom() + dy); + damagedContentsRect.setHeight(-dy); + } + } + + // Move the previous damage + m_rootLayerScrollDamage.move(scrollDelta.width(), scrollDelta.height()); + // Union with the new damage rect. + m_rootLayerScrollDamage.unite(damagedContentsRect); + + // Scroll any existing damage that intersects with clip rect + if (clipRect.intersects(m_rootLayerDirtyRect)) { + // Find the inner damage + IntRect innerDamage(clipRect); + innerDamage.intersect(m_rootLayerDirtyRect); + + // Move the damage + innerDamage.move(scrollDelta.width(), scrollDelta.height()); + + // Merge it back into the damaged rect + m_rootLayerDirtyRect.unite(innerDamage); + } + + setRootLayerNeedsDisplay(); +} + +void WebViewImpl::invalidateRootLayerRect(const IntRect& rect) +{ + ASSERT(m_layerRenderer); + + if (!page()) + return; + + // FIXME: add a smarter damage aggregation logic and/or unify with + // LayerChromium's damage logic + m_rootLayerDirtyRect.unite(rect); + setRootLayerNeedsDisplay(); +} + + +void WebViewImpl::setIsAcceleratedCompositingActive(bool active) +{ + ChromiumBridge::histogramEnumeration("GPU.setIsAcceleratedCompositingActive", active * 2 + m_isAcceleratedCompositingActive, 4); + + if (m_isAcceleratedCompositingActive == active) + return; + + if (!active) { + m_isAcceleratedCompositingActive = false; + if (m_layerRenderer) + m_layerRenderer->finish(); // finish all GL rendering before we hide the window? + m_client->didActivateAcceleratedCompositing(false); + return; + } + + if (m_layerRenderer) { + m_isAcceleratedCompositingActive = true; + m_layerRenderer->resizeOnscreenContent(WebCore::IntSize(std::max(1, m_size.width), + std::max(1, m_size.height))); + + m_client->didActivateAcceleratedCompositing(true); + return; + } + + RefPtr<GraphicsContext3D> context = m_temporaryOnscreenGraphicsContext3D.release(); + if (!context) { + context = GraphicsContext3D::create(getCompositorContextAttributes(), m_page->chrome(), GraphicsContext3D::RenderDirectlyToHostWindow); + if (context) + context->reshape(std::max(1, m_size.width), std::max(1, m_size.height)); + } + m_layerRenderer = LayerRendererChromium::create(context.release()); + if (m_layerRenderer) { + m_client->didActivateAcceleratedCompositing(true); + m_isAcceleratedCompositingActive = true; + m_compositorCreationFailed = false; + } else { + m_isAcceleratedCompositingActive = false; + m_client->didActivateAcceleratedCompositing(false); + m_compositorCreationFailed = true; + } +} + +void WebViewImpl::updateRootLayerContents(const IntRect& rect) +{ + if (!isAcceleratedCompositingActive()) + return; + + WebFrameImpl* webframe = mainFrameImpl(); + if (!webframe) + return; + FrameView* view = webframe->frameView(); + if (!view) + return; + + LayerChromium* rootLayer = m_layerRenderer->rootLayer(); + if (rootLayer) { + IntRect visibleRect = view->visibleContentRect(true); + + m_layerRenderer->setRootLayerCanvasSize(IntSize(rect.width(), rect.height())); + GraphicsContext* rootLayerContext = m_layerRenderer->rootLayerGraphicsContext(); + +#if PLATFORM(SKIA) + PlatformContextSkia* skiaContext = rootLayerContext->platformContext(); + skia::PlatformCanvas* platformCanvas = skiaContext->canvas(); + + platformCanvas->save(); + + // Bring the canvas into the coordinate system of the paint rect. + platformCanvas->translate(static_cast<SkScalar>(-rect.x()), static_cast<SkScalar>(-rect.y())); + + rootLayerContext->save(); + + webframe->paintWithContext(*rootLayerContext, rect); + rootLayerContext->restore(); + + platformCanvas->restore(); +#elif PLATFORM(CG) + CGContextRef cgContext = rootLayerContext->platformContext(); + + CGContextSaveGState(cgContext); + + // Bring the CoreGraphics context into the coordinate system of the paint rect. + CGContextTranslateCTM(cgContext, -rect.x(), -rect.y()); + + rootLayerContext->save(); + + webframe->paintWithContext(*rootLayerContext, rect); + rootLayerContext->restore(); + + CGContextRestoreGState(cgContext); +#else +#error Must port to your platform +#endif + } +} + +void WebViewImpl::doComposite() +{ + ASSERT(isAcceleratedCompositingActive()); + if (!page()) + return; + FrameView* view = page()->mainFrame()->view(); + + // The visibleRect includes scrollbars whereas the contentRect doesn't. + IntRect visibleRect = view->visibleContentRect(true); + IntRect contentRect = view->visibleContentRect(false); + IntRect viewPort = IntRect(0, 0, m_size.width, m_size.height); + + // Give the compositor a chance to setup/resize the root texture handle and perform scrolling. + m_layerRenderer->prepareToDrawLayers(visibleRect, contentRect, IntPoint(view->scrollX(), view->scrollY())); + + // Draw the contents of the root layer. + Vector<IntRect> damageRects; + damageRects.append(m_rootLayerScrollDamage); + damageRects.append(m_rootLayerDirtyRect); + for (size_t i = 0; i < damageRects.size(); ++i) { + IntRect damagedRect = damageRects[i]; + + // Intersect this rectangle with the viewPort. + damagedRect.intersect(viewPort); + + // Now render it. + if (damagedRect.width() && damagedRect.height()) { + updateRootLayerContents(damagedRect); + m_layerRenderer->updateRootLayerTextureRect(damagedRect); + } + } + m_rootLayerDirtyRect = IntRect(); + m_rootLayerScrollDamage = IntRect(); + + // Draw the actual layers... + m_layerRenderer->drawLayers(visibleRect, contentRect); +} + +void WebViewImpl::reallocateRenderer() +{ + GraphicsContext3D* context = m_layerRenderer->context(); + RefPtr<GraphicsContext3D> newContext = GraphicsContext3D::create(context->getContextAttributes(), m_page->chrome(), GraphicsContext3D::RenderDirectlyToHostWindow); + // GraphicsContext3D::create might fail and return 0, in that case LayerRendererChromium::create will also return 0. + RefPtr<LayerRendererChromium> layerRenderer = LayerRendererChromium::create(newContext); + + // Reattach the root layer. Child layers will get reattached as a side effect of updateLayersRecursive. + if (layerRenderer) + m_layerRenderer->transferRootLayer(layerRenderer.get()); + m_layerRenderer = layerRenderer; + + // Enable or disable accelerated compositing and request a refresh. + setRootGraphicsLayer(m_layerRenderer ? m_layerRenderer->rootLayer() : 0); +} +#endif + + +WebGraphicsContext3D* WebViewImpl::graphicsContext3D() +{ +#if USE(ACCELERATED_COMPOSITING) + if (m_page->settings()->acceleratedCompositingEnabled() && allowsAcceleratedCompositing()) { + GraphicsContext3D* context = 0; + if (m_layerRenderer) + context = m_layerRenderer->context(); + else if (m_temporaryOnscreenGraphicsContext3D) + context = m_temporaryOnscreenGraphicsContext3D.get(); + else { + m_temporaryOnscreenGraphicsContext3D = GraphicsContext3D::create(getCompositorContextAttributes(), m_page->chrome(), GraphicsContext3D::RenderDirectlyToHostWindow); + if (m_temporaryOnscreenGraphicsContext3D) + m_temporaryOnscreenGraphicsContext3D->reshape(std::max(1, m_size.width), std::max(1, m_size.height)); + context = m_temporaryOnscreenGraphicsContext3D.get(); + } + return GraphicsContext3DInternal::extractWebGraphicsContext3D(context); + } +#endif + return 0; +} + } // namespace WebKit diff --git a/WebKit/chromium/src/WebViewImpl.h b/WebKit/chromium/src/WebViewImpl.h index 286ac43..0388770 100644 --- a/WebKit/chromium/src/WebViewImpl.h +++ b/WebKit/chromium/src/WebViewImpl.h @@ -31,21 +31,24 @@ #ifndef WebViewImpl_h #define WebViewImpl_h -// FIXME: Remove these relative paths once consumers from glue are removed. -#include "../public/WebNavigationPolicy.h" -#include "../public/WebPoint.h" -#include "../public/WebSize.h" -#include "../public/WebString.h" -#include "../public/WebView.h" +#include "WebNavigationPolicy.h" +#include "WebPoint.h" +#include "WebRect.h" +#include "WebSize.h" +#include "WebString.h" +#include "WebView.h" #include "BackForwardListClientImpl.h" #include "ChromeClientImpl.h" #include "ContextMenuClientImpl.h" #include "DragClientImpl.h" #include "EditorClientImpl.h" +#include "GraphicsContext3D.h" +#include "GraphicsLayer.h" #include "InspectorClientImpl.h" +#include "IntRect.h" +#include "LayerRendererChromium.h" #include "NotificationPresenterImpl.h" - #include <wtf/OwnPtr.h> #include <wtf/RefCounted.h> @@ -68,14 +71,19 @@ namespace WebKit { class AutocompletePopupMenuClient; class AutoFillPopupMenuClient; class ContextMenuClientImpl; -class SuggestionsPopupMenuClient; +class DeviceOrientationClientProxy; +class DragScrollTimer; +class SpeechInputClientImpl; class WebAccessibilityObject; +class WebDevToolsAgentClient; class WebDevToolsAgentPrivate; class WebFrameImpl; +class WebImage; class WebKeyboardEvent; class WebMouseEvent; class WebMouseWheelEvent; class WebSettingsImpl; +class WebTouchEvent; class WebViewImpl : public WebView, public RefCounted<WebViewImpl> { public: @@ -85,17 +93,21 @@ public: virtual void resize(const WebSize&); virtual void layout(); virtual void paint(WebCanvas*, const WebRect&); + virtual void themeChanged(); + virtual void composite(bool finish); virtual bool handleInputEvent(const WebInputEvent&); virtual void mouseCaptureLost(); virtual void setFocus(bool enable); - virtual bool handleCompositionEvent(WebCompositionCommand command, - int cursorPosition, - int targetStart, - int targetEnd, - const WebString& text); - virtual bool queryCompositionStatus(bool* enabled, - WebRect* caretRect); + virtual bool setComposition( + const WebString& text, + const WebVector<WebCompositionUnderline>& underlines, + int selectionStart, + int selectionEnd); + virtual bool confirmComposition(); + virtual WebTextInputType textInputType(); + virtual WebRect caretOrSelectionBounds(); virtual void setTextDirection(WebTextDirection direction); + virtual bool isAcceleratedCompositingActive() const; // WebView methods: virtual void initializeMainFrame(WebFrameClient*); @@ -110,6 +122,7 @@ public: virtual void setTabKeyCyclesThroughElements(bool value); virtual bool isActive() const; virtual void setIsActive(bool value); + virtual void setDomainRelaxationForbidden(bool, const WebString& scheme); virtual bool dispatchBeforeUnloadEvent(); virtual void dispatchUnloadEvent(); virtual WebFrame* mainFrame(); @@ -119,8 +132,11 @@ public: virtual void setFocusedFrame(WebFrame* frame); virtual void setInitialFocus(bool reverse); virtual void clearFocusedNode(); - virtual int zoomLevel(); - virtual int setZoomLevel(bool textOnly, int zoomLevel); + virtual void scrollFocusedNodeIntoView(); + virtual double zoomLevel(); + virtual double setZoomLevel(bool textOnly, double zoomLevel); + virtual void zoomLimitsChanged(double minimumZoomLevel, + double maximumZoomLevel); virtual void performMediaPlayerAction( const WebMediaPlayerAction& action, const WebPoint& location); @@ -129,12 +145,21 @@ public: const WebPoint& clientPoint, const WebPoint& screenPoint, WebDragOperation operation); + virtual void dragSourceMovedTo( + const WebPoint& clientPoint, + const WebPoint& screenPoint, + WebDragOperation operation); virtual void dragSourceSystemDragEnded(); virtual WebDragOperation dragTargetDragEnter( const WebDragData& dragData, int identity, const WebPoint& clientPoint, const WebPoint& screenPoint, WebDragOperationsMask operationsAllowed); + virtual WebDragOperation dragTargetDragEnterNew( + int identity, + const WebPoint& clientPoint, + const WebPoint& screenPoint, + WebDragOperationsMask operationsAllowed); virtual WebDragOperation dragTargetDragOver( const WebPoint& clientPoint, const WebPoint& screenPoint, @@ -149,24 +174,31 @@ public: virtual void inspectElementAt(const WebPoint& point); virtual WebString inspectorSettings() const; virtual void setInspectorSettings(const WebString& settings); + virtual bool inspectorSetting(const WebString& key, WebString* value) const; + virtual void setInspectorSetting(const WebString& key, + const WebString& value); virtual WebDevToolsAgent* devToolsAgent(); - virtual void setDevToolsAgent(WebDevToolsAgent*); virtual WebAccessibilityObject accessibilityObject(); - virtual void applyAutofillSuggestions( + // DEPRECATED. + virtual void applyAutoFillSuggestions( const WebNode&, - const WebVector<WebString>& suggestions, - int defaultSuggestionIndex); + const WebVector<WebString>& names, + const WebVector<WebString>& labels, + const WebVector<int>& uniqueIDs, + int separatorIndex); virtual void applyAutoFillSuggestions( const WebNode&, const WebVector<WebString>& names, const WebVector<WebString>& labels, - int defaultSuggestionIndex); + const WebVector<WebString>& icons, + const WebVector<int>& uniqueIDs, + int separatorIndex); + // DEPRECATED: replacing with applyAutoFillSuggestions. virtual void applyAutocompleteSuggestions( const WebNode&, const WebVector<WebString>& suggestions, int defaultSuggestionIndex); - virtual void hideAutofillPopup(); - virtual void hideSuggestionsPopup(); + virtual void hidePopups(); virtual void setScrollbarColors(unsigned inactiveColor, unsigned activeColor, unsigned trackColor); @@ -175,9 +207,6 @@ public: unsigned inactiveBackgroundColor, unsigned inactiveForegroundColor); virtual void performCustomContextMenuAction(unsigned action); - virtual void addUserScript(const WebString& sourceCode, - bool runAtStart); - virtual void removeAllUserContent(); // WebViewImpl @@ -201,7 +230,7 @@ public: return m_client; } - // Returns the page object associated with this view. This may be null when + // Returns the page object associated with this view. This may be null when // the page is shutting down, but will be valid at all other times. WebCore::Page* page() const { @@ -210,7 +239,7 @@ public: WebCore::RenderTheme* theme() const; - // Returns the main frame associated with this view. This may be null when + // Returns the main frame associated with this view. This may be null when // the page is shutting down, but will be valid at all other times. WebFrameImpl* mainFrameImpl(); @@ -226,23 +255,28 @@ public: void mouseUp(const WebMouseEvent&); void mouseContextMenu(const WebMouseEvent&); void mouseDoubleClick(const WebMouseEvent&); - void mouseWheel(const WebMouseWheelEvent&); + bool mouseWheel(const WebMouseWheelEvent&); bool keyEvent(const WebKeyboardEvent&); bool charEvent(const WebKeyboardEvent&); + bool touchEvent(const WebTouchEvent&); // Handles context menu events orignated via the the keyboard. These - // include the VK_APPS virtual key and the Shift+F10 combine. Code is + // include the VK_APPS virtual key and the Shift+F10 combine. Code is // based on the Webkit function bool WebView::handleContextMenuEvent(WPARAM // wParam, LPARAM lParam) in webkit\webkit\win\WebView.cpp. The only // significant change in this function is the code to convert from a // Keyboard event to the Right Mouse button down event. bool sendContextMenuEvent(const WebKeyboardEvent&); - // Notifies the WebView that a load has been committed. isNewNavigation + // Notifies the WebView that a load has been committed. isNewNavigation // will be true if a new session history item should be created for that // load. void didCommitLoad(bool* isNewNavigation); + // Returns true if popup menus should be rendered by the browser, false if + // they should be rendered by WebKit (which is the default). + static bool useExternalPopupMenus(); + bool contextMenuAllowed() const { return m_contextMenuAllowed; @@ -270,13 +304,14 @@ public: // Start a system drag and drop operation. void startDragging( - const WebPoint& eventPos, const WebDragData& dragData, - WebDragOperationsMask dragSourceOperationMask); + WebDragOperationsMask mask, + const WebImage& dragImage, + const WebPoint& dragImageOffset); - void suggestionsPopupDidHide() + void autoFillPopupDidHide() { - m_suggestionsPopupShowing = false; + m_autoFillPopupShowing = false; } #if ENABLE(NOTIFICATIONS) @@ -288,39 +323,96 @@ public: // was scrolled. bool propagateScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity); - // HACK: currentInputEvent() is for ChromeClientImpl::show(), until we can - // fix WebKit to pass enough information up into ChromeClient::show() so we - // can decide if the window.open event was caused by a middle-mouse click + // Notification that a popup was opened/closed. + void popupOpened(WebCore::PopupContainer* popupContainer); + void popupClosed(WebCore::PopupContainer* popupContainer); + + void hideAutoFillPopup(); + + // Returns the input event we're currently processing. This is used in some + // cases where the WebCore DOM event doesn't have the information we need. static const WebInputEvent* currentInputEvent() { return m_currentInputEvent; } +#if USE(ACCELERATED_COMPOSITING) + bool allowsAcceleratedCompositing(); + void setRootGraphicsLayer(WebCore::PlatformLayer*); + void setRootLayerNeedsDisplay(); + void scrollRootLayerRect(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& clipRect); + void invalidateRootLayerRect(const WebCore::IntRect&); +#endif + + // Returns the onscreen 3D context used by the compositor. This is + // used by the renderer's code to set up resource sharing between + // the compositor's context and subordinate contexts for APIs like + // WebGL. Returns 0 if compositing support is not compiled in. + virtual WebGraphicsContext3D* graphicsContext3D(); + + WebCore::PopupContainer* selectPopup() const { return m_selectPopup.get(); } + + // Returns true if the event leads to scrolling. + static bool mapKeyCodeForScroll(int keyCode, + WebCore::ScrollDirection* scrollDirection, + WebCore::ScrollGranularity* scrollGranularity); + + // Called by a full frame plugin inside this view to inform it that its + // zoom level has been updated. The plugin should only call this function + // if the zoom change was triggered by the browser, it's only needed in case + // a plugin can update its own zoom, say because of its own UI. + void fullFramePluginZoomLevelChanged(double zoomLevel); + private: friend class WebView; // So WebView::Create can call our constructor friend class WTF::RefCounted<WebViewImpl>; - WebViewImpl(WebViewClient* client); + enum DragAction { + DragEnter, + DragOver + }; + + WebViewImpl(WebViewClient* client, WebDevToolsAgentClient* devToolsClient); ~WebViewImpl(); // Returns true if the event was actually processed. bool keyEventDefault(const WebKeyboardEvent&); + // Returns true if the select popup has consumed the event. + bool selectPopupHandleKeyEvent(const WebKeyboardEvent&); + // Returns true if the autocomple has consumed the event. bool autocompleteHandleKeyEvent(const WebKeyboardEvent&); - // Repaints the suggestions popup. Should be called when the suggestions - // have changed. Note that this should only be called when the suggestions + // Repaints the AutoFill popup. Should be called when the suggestions + // have changed. Note that this should only be called when the AutoFill // popup is showing. - void refreshSuggestionsPopup(); + void refreshAutoFillPopup(); // Returns true if the view was scrolled. bool scrollViewWithKeyboard(int keyCode, int modifiers); + void hideSelectPopup(); + // Converts |pos| from window coordinates to contents coordinates and gets // the HitTestResult for it. WebCore::HitTestResult hitTestResultForWindowPos(const WebCore::IntPoint&); + // Consolidate some common code between starting a drag over a target and + // updating a drag over a target. If we're starting a drag, |isEntering| + // should be true. + WebDragOperation dragTargetDragEnterOrOver(const WebPoint& clientPoint, + const WebPoint& screenPoint, + DragAction); + +#if USE(ACCELERATED_COMPOSITING) + void setIsAcceleratedCompositingActive(bool); + void updateRootLayerContents(const WebCore::IntRect&); + void doComposite(); + void doPixelReadbackToCanvas(WebCanvas*, const WebCore::IntRect&); + void reallocateRenderer(); +#endif + WebViewClient* m_client; BackForwardListClientImpl m_backForwardListClientImpl; @@ -335,7 +427,7 @@ private: WebPoint m_lastMousePosition; OwnPtr<WebCore::Page> m_page; - // This flag is set when a new navigation is detected. It is used to satisfy + // This flag is set when a new navigation is detected. It is used to satisfy // the corresponding argument to WebFrameClient::didCommitProvisionalLoad. bool m_observedNewNavigation; #ifndef NDEBUG @@ -345,7 +437,7 @@ private: #endif // An object that can be used to manipulate m_page->settings() without linking - // against WebCore. This is lazily allocated the first time GetWebSettings() + // against WebCore. This is lazily allocated the first time GetWebSettings() // is called. OwnPtr<WebSettingsImpl> m_webSettings; @@ -361,9 +453,13 @@ private: // dragged by the time a drag is initiated. WebPoint m_lastMouseDownPoint; - // Keeps track of the current zoom level. 0 means no zoom, positive numbers + // Keeps track of the current zoom level. 0 means no zoom, positive numbers // mean zoom in, negative numbers mean zoom out. - int m_zoomLevel; + double m_zoomLevel; + + double m_minimumZoomLevel; + + double m_maximumZoomLevel; bool m_contextMenuAllowed; @@ -391,7 +487,7 @@ private: // copied from the WebDropData object sent from the browser process. int m_dragIdentity; - // Valid when m_dragTargetDispatch is true. Used to override the default + // Valid when m_dragTargetDispatch is true. Used to override the default // browser drop effect with the effects "none" or "copy". enum DragTargetDropEffect { DropEffectDefault = -1, @@ -407,28 +503,17 @@ private: // current drop target in this WebView (the drop target can accept the drop). WebDragOperation m_dragOperation; - // Whether a suggestions popup is currently showing. - bool m_suggestionsPopupShowing; - - // A pointer to the current suggestions popup menu client. This can be - // either an AutoFillPopupMenuClient or an AutocompletePopupMenuClient. We - // do not own this pointer. - SuggestionsPopupMenuClient* m_suggestionsPopupClient; + // Whether an AutoFill popup is currently showing. + bool m_autoFillPopupShowing; // The AutoFill popup client. OwnPtr<AutoFillPopupMenuClient> m_autoFillPopupClient; - // The Autocomplete popup client. - OwnPtr<AutocompletePopupMenuClient> m_autocompletePopupClient; - - // A pointer to the current suggestions popup. We do not own this pointer. - WebCore::PopupContainer* m_suggestionsPopup; - - // The AutoFill suggestions popup. + // The AutoFill popup. RefPtr<WebCore::PopupContainer> m_autoFillPopup; - // The AutoComplete suggestions popup. - RefPtr<WebCore::PopupContainer> m_autocompletePopup; + // The popup associated with a select element. + RefPtr<WebCore::PopupContainer> m_selectPopup; OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent; @@ -441,12 +526,35 @@ private: // Inspector settings. WebString m_inspectorSettings; + typedef HashMap<WTF::String, WTF::String> SettingsMap; + OwnPtr<SettingsMap> m_inspectorSettingsMap; + OwnPtr<DragScrollTimer> m_dragScrollTimer; + #if ENABLE(NOTIFICATIONS) // The provider of desktop notifications; NotificationPresenterImpl m_notificationPresenter; #endif + // If set, the (plugin) node which has mouse capture. + RefPtr<WebCore::Node> m_mouseCaptureNode; + +#if USE(ACCELERATED_COMPOSITING) + WebCore::IntRect m_rootLayerDirtyRect; + WebCore::IntRect m_rootLayerScrollDamage; + RefPtr<WebCore::LayerRendererChromium> m_layerRenderer; + bool m_isAcceleratedCompositingActive; + bool m_compositorCreationFailed; +#endif static const WebInputEvent* m_currentInputEvent; + +#if ENABLE(INPUT_SPEECH) + OwnPtr<SpeechInputClientImpl> m_speechInputClient; +#endif + // If we attempt to fetch the on-screen GraphicsContext3D before + // the compositor has been turned on, we need to instantiate it + // early. This member holds on to the GC3D in this case. + RefPtr<WebCore::GraphicsContext3D> m_temporaryOnscreenGraphicsContext3D; + OwnPtr<DeviceOrientationClientProxy> m_deviceOrientationClientProxy; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebWorkerBase.cpp b/WebKit/chromium/src/WebWorkerBase.cpp index 40019e8..de4858c 100644 --- a/WebKit/chromium/src/WebWorkerBase.cpp +++ b/WebKit/chromium/src/WebWorkerBase.cpp @@ -31,17 +31,24 @@ #include "config.h" #include "WebWorkerBase.h" -#include "GenericWorkerTask.h" +#include "CrossThreadTask.h" +#include "DatabaseTask.h" #include "MessagePortChannel.h" #include "PlatformMessagePortChannel.h" #include "WebDataSourceImpl.h" +#include "WebFileError.h" #include "WebFrameClient.h" #include "WebFrameImpl.h" #include "WebMessagePortChannel.h" +#include "WebRuntimeFeatures.h" +#include "WebSettings.h" #include "WebView.h" #include "WebWorkerClient.h" +#include "WorkerContext.h" +#include "WorkerFileSystemCallbacksBridge.h" +#include "WorkerScriptController.h" #include "WorkerThread.h" #include <wtf/MainThread.h> @@ -51,30 +58,69 @@ namespace WebKit { #if ENABLE(WORKERS) -// Dummy WebViewDelegate - we only need it in Worker process to load a -// 'shadow page' which will initialize WebCore loader. -class WorkerWebFrameClient : public WebFrameClient { +static const char allowDatabaseMode[] = "allowDatabaseMode"; +static const char openFileSystemMode[] = "openFileSystemMode"; + +namespace { + +// This class is used to route the result of the WebWorkerBase::allowDatabase +// call back to the worker context. +class AllowDatabaseMainThreadBridge : public ThreadSafeShared<AllowDatabaseMainThreadBridge> { public: - // Tell the loader to load the data into the 'shadow page' synchronously, - // so we can grab the resulting Document right after load. - virtual void didCreateDataSource(WebFrame* frame, WebDataSource* ds) + static PassRefPtr<AllowDatabaseMainThreadBridge> create(WebWorkerBase* worker, const WTF::String& mode, WebCommonWorkerClient* commonClient, WebFrame* frame, const WTF::String& name, const WTF::String& displayName, unsigned long estimatedSize) { - static_cast<WebDataSourceImpl*>(ds)->setDeferMainResourceDataLoad(false); + return adoptRef(new AllowDatabaseMainThreadBridge(worker, mode, commonClient, frame, name, displayName, estimatedSize)); } - // Lazy allocate and leak this instance. - static WorkerWebFrameClient* sharedInstance() + // These methods are invoked on the worker context. + void cancel() { - static WorkerWebFrameClient client; - return &client; + MutexLocker locker(m_mutex); + m_worker = 0; + } + + bool result() + { + return m_result; + } + + // This method is invoked on the main thread. + void signalCompleted(bool result) + { + MutexLocker locker(m_mutex); + if (m_worker) + m_worker->postTaskForModeToWorkerContext(createCallbackTask(&didComplete, this, result), m_mode); } private: - WorkerWebFrameClient() + AllowDatabaseMainThreadBridge(WebWorkerBase* worker, const WTF::String& mode, WebCommonWorkerClient* commonClient, WebFrame* frame, const WTF::String& name, const WTF::String& displayName, unsigned long estimatedSize) + : m_worker(worker) + , m_mode(mode) + { + worker->dispatchTaskToMainThread(createCallbackTask(&allowDatabaseTask, commonClient, frame, String(name), String(displayName), estimatedSize, this)); + } + + static void allowDatabaseTask(WebCore::ScriptExecutionContext* context, WebCommonWorkerClient* commonClient, WebFrame* frame, const WTF::String name, const WTF::String displayName, unsigned long estimatedSize, PassRefPtr<AllowDatabaseMainThreadBridge> bridge) + { + if (!commonClient) + bridge->signalCompleted(false); + else + bridge->signalCompleted(commonClient->allowDatabase(frame, name, displayName, estimatedSize)); + } + + static void didComplete(WebCore::ScriptExecutionContext* context, PassRefPtr<AllowDatabaseMainThreadBridge> bridge, bool result) { + bridge->m_result = result; } + + bool m_result; + Mutex m_mutex; + WebWorkerBase* m_worker; + WTF::String m_mode; }; +} + // This function is called on the main thread to force to initialize some static // values used in WebKit before any worker thread is started. This is because in // our worker processs, we do not run any WebKit code in main thread and thus @@ -103,6 +149,9 @@ WebWorkerBase::WebWorkerBase() WebWorkerBase::~WebWorkerBase() { ASSERT(m_webView); + WebFrameImpl* webFrame = static_cast<WebFrameImpl*>(m_webView->mainFrame()); + if (webFrame) + webFrame->setClient(0); m_webView->close(); } @@ -121,8 +170,9 @@ void WebWorkerBase::initializeLoader(const WebURL& url) // loading requests from the worker context to the rest of WebKit and Chromium // infrastructure. ASSERT(!m_webView); - m_webView = WebView::create(0); - m_webView->initializeMainFrame(WorkerWebFrameClient::sharedInstance()); + m_webView = WebView::create(0, 0); + m_webView->settings()->setOfflineWebApplicationCacheEnabled(WebRuntimeFeatures::isApplicationCacheEnabled()); + m_webView->initializeMainFrame(this); WebFrameImpl* webFrame = static_cast<WebFrameImpl*>(m_webView->mainFrame()); @@ -140,7 +190,7 @@ void WebWorkerBase::initializeLoader(const WebURL& url) void WebWorkerBase::dispatchTaskToMainThread(PassOwnPtr<ScriptExecutionContext::Task> task) { - return callOnMainThread(invokeTaskMethod, task.release()); + callOnMainThread(invokeTaskMethod, task.leakPtr()); } void WebWorkerBase::invokeTaskMethod(void* param) @@ -151,6 +201,62 @@ void WebWorkerBase::invokeTaskMethod(void* param) delete task; } +void WebWorkerBase::didCreateDataSource(WebFrame*, WebDataSource* ds) +{ + // Tell the loader to load the data into the 'shadow page' synchronously, + // so we can grab the resulting Document right after load. + static_cast<WebDataSourceImpl*>(ds)->setDeferMainResourceDataLoad(false); +} + +WebApplicationCacheHost* WebWorkerBase::createApplicationCacheHost(WebFrame*, WebApplicationCacheHostClient* appcacheHostClient) +{ + if (commonClient()) + return commonClient()->createApplicationCacheHost(appcacheHostClient); + return 0; +} + +bool WebWorkerBase::allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize) +{ + WorkerRunLoop& runLoop = m_workerThread->runLoop(); + WorkerScriptController* controller = WorkerScriptController::controllerForContext(); + WorkerContext* workerContext = controller->workerContext(); + + // Create a unique mode just for this synchronous call. + String mode = allowDatabaseMode; + mode.append(String::number(runLoop.createUniqueId())); + + RefPtr<AllowDatabaseMainThreadBridge> bridge = AllowDatabaseMainThreadBridge::create(this, mode, commonClient(), m_webView->mainFrame(), String(name), String(displayName), estimatedSize); + + // Either the bridge returns, or the queue gets terminated. + if (runLoop.runInMode(workerContext, mode) == MessageQueueTerminated) { + bridge->cancel(); + return false; + } + + return bridge->result(); +} + +#if ENABLE(FILE_SYSTEM) +void WebWorkerBase::openFileSystem(WebFileSystem::Type type, long long size, WebFileSystemCallbacks* callbacks, bool synchronous) +{ + WorkerRunLoop& runLoop = m_workerThread->runLoop(); + WorkerScriptController* controller = WorkerScriptController::controllerForContext(); + WorkerContext* workerContext = controller->workerContext(); + + // Create a unique mode for this openFileSystem call. + String mode = openFileSystemMode; + mode.append(String::number(runLoop.createUniqueId())); + + RefPtr<WorkerFileSystemCallbacksBridge> bridge = WorkerFileSystemCallbacksBridge::create(this, workerContext, callbacks); + bridge->postOpenFileSystemToMainThread(commonClient(), type, size, mode); + + if (synchronous) { + if (runLoop.runInMode(workerContext, mode) == MessageQueueTerminated) + bridge->stop(); + } +} +#endif + // WorkerObjectProxy ----------------------------------------------------------- void WebWorkerBase::postMessageToWorkerObject(PassRefPtr<SerializedScriptValue> message, @@ -199,8 +305,7 @@ void WebWorkerBase::postExceptionTask(ScriptExecutionContext* context, sourceURL); } -void WebWorkerBase::postConsoleMessageToWorkerObject(MessageDestination destination, - MessageSource source, +void WebWorkerBase::postConsoleMessageToWorkerObject(MessageSource source, MessageType type, MessageLevel level, const String& message, @@ -208,16 +313,13 @@ void WebWorkerBase::postConsoleMessageToWorkerObject(MessageDestination destinat const String& sourceURL) { dispatchTaskToMainThread(createCallbackTask(&postConsoleMessageTask, this, - static_cast<int>(destination), - static_cast<int>(source), - static_cast<int>(type), - static_cast<int>(level), + source, type, level, message, lineNumber, sourceURL)); } void WebWorkerBase::postConsoleMessageTask(ScriptExecutionContext* context, WebWorkerBase* thisPtr, - int destination, int source, + int source, int type, int level, const String& message, int lineNumber, @@ -225,7 +327,7 @@ void WebWorkerBase::postConsoleMessageTask(ScriptExecutionContext* context, { if (!thisPtr->commonClient()) return; - thisPtr->commonClient()->postConsoleMessageToWorkerObject(destination, source, + thisPtr->commonClient()->postConsoleMessageToWorkerObject(source, type, level, message, lineNumber, sourceURL); } diff --git a/WebKit/chromium/src/WebWorkerBase.h b/WebKit/chromium/src/WebWorkerBase.h index 0217401..fe84bf7 100644 --- a/WebKit/chromium/src/WebWorkerBase.h +++ b/WebKit/chromium/src/WebWorkerBase.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2010 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -34,6 +34,7 @@ #if ENABLE(WORKERS) #include "ScriptExecutionContext.h" +#include "WebFrameClient.h" #include "WorkerLoaderProxy.h" #include "WorkerObjectProxy.h" #include <wtf/PassOwnPtr.h> @@ -44,16 +45,22 @@ class WorkerThread; } namespace WebKit { +class WebApplicationCacheHost; +class WebApplicationCacheHostClient; class WebCommonWorkerClient; +class WebSecurityOrigin; +class WebString; class WebURL; class WebView; +class WebWorker; class WebWorkerClient; // Base class for WebSharedWorkerImpl and WebWorkerImpl. It contains common // code used by both implementation classes, including implementations of the // WorkerObjectProxy and WorkerLoaderProxy interfaces. class WebWorkerBase : public WebCore::WorkerObjectProxy - , public WebCore::WorkerLoaderProxy { + , public WebCore::WorkerLoaderProxy + , public WebFrameClient { public: WebWorkerBase(); virtual ~WebWorkerBase(); @@ -63,10 +70,10 @@ public: PassRefPtr<WebCore::SerializedScriptValue>, PassOwnPtr<WebCore::MessagePortChannelArray>); virtual void postExceptionToWorkerObject( - const WebCore::String&, int, const WebCore::String&); + const WTF::String&, int, const WTF::String&); virtual void postConsoleMessageToWorkerObject( - WebCore::MessageDestination, WebCore::MessageSource, WebCore::MessageType, - WebCore::MessageLevel, const WebCore::String&, int, const WebCore::String&); + WebCore::MessageSource, WebCore::MessageType, + WebCore::MessageLevel, const WTF::String&, int, const WTF::String&); virtual void confirmMessageFromWorkerObject(bool); virtual void reportPendingActivity(bool); virtual void workerContextClosed(); @@ -75,7 +82,19 @@ public: // WebCore::WorkerLoaderProxy methods: virtual void postTaskToLoader(PassOwnPtr<WebCore::ScriptExecutionContext::Task>); virtual void postTaskForModeToWorkerContext( - PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const WebCore::String& mode); + PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const WTF::String& mode); + + // WebFrameClient methods to support resource loading thru the 'shadow page'. + virtual void didCreateDataSource(WebFrame*, WebDataSource*); + virtual WebApplicationCacheHost* createApplicationCacheHost(WebFrame*, WebApplicationCacheHostClient*); + + // Controls whether access to Web Databases is allowed for this worker. + virtual bool allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize); + +#if ENABLE(FILE_SYSTEM) + // Requests to open a file system for this worker. (Note that this is not the implementation for WebFrameClient::openFileSystem.) + void openFileSystem(WebFileSystem::Type, long long size, WebFileSystemCallbacks*, bool synchronous); +#endif // Executes the given task on the main thread. static void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>); @@ -101,24 +120,23 @@ private: static void postMessageTask( WebCore::ScriptExecutionContext* context, WebWorkerBase* thisPtr, - WebCore::String message, + WTF::String message, PassOwnPtr<WebCore::MessagePortChannelArray> channels); static void postExceptionTask( WebCore::ScriptExecutionContext* context, WebWorkerBase* thisPtr, - const WebCore::String& message, + const WTF::String& message, int lineNumber, - const WebCore::String& sourceURL); + const WTF::String& sourceURL); static void postConsoleMessageTask( WebCore::ScriptExecutionContext* context, WebWorkerBase* thisPtr, - int destination, int source, int type, int level, - const WebCore::String& message, + const WTF::String& message, int lineNumber, - const WebCore::String& sourceURL); + const WTF::String& sourceURL); static void confirmMessageTask( WebCore::ScriptExecutionContext* context, WebWorkerBase* thisPtr, diff --git a/WebKit/chromium/src/WebWorkerClientImpl.cpp b/WebKit/chromium/src/WebWorkerClientImpl.cpp index 598a078..18282e3 100644 --- a/WebKit/chromium/src/WebWorkerClientImpl.cpp +++ b/WebKit/chromium/src/WebWorkerClientImpl.cpp @@ -33,11 +33,11 @@ #if ENABLE(WORKERS) +#include "CrossThreadTask.h" #include "DedicatedWorkerThread.h" #include "ErrorEvent.h" #include "Frame.h" #include "FrameLoaderClient.h" -#include "GenericWorkerTask.h" #include "MessageEvent.h" #include "MessagePort.h" #include "MessagePortChannel.h" @@ -45,6 +45,7 @@ #include "Worker.h" #include "WorkerContext.h" #include "WorkerContextExecutionProxy.h" +#include "WorkerScriptController.h" #include "WorkerMessagingProxy.h" #include <wtf/Threading.h> @@ -94,15 +95,13 @@ WorkerContextProxy* WebWorkerClientImpl::createWorkerContextProxy(Worker* worker WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame()); webWorker = webFrame->client()->createWorker(webFrame, proxy); } else { - WorkerContextExecutionProxy* currentContext = - WorkerContextExecutionProxy::retrieve(); - if (!currentContext) { + WorkerScriptController* controller = WorkerScriptController::controllerForContext(); + if (!controller) { ASSERT_NOT_REACHED(); return 0; } - DedicatedWorkerThread* thread = - static_cast<DedicatedWorkerThread*>(currentContext->workerContext()->thread()); + DedicatedWorkerThread* thread = static_cast<DedicatedWorkerThread*>(controller->workerContext()->thread()); WorkerObjectProxy* workerObjectProxy = &thread->workerObjectProxy(); WebWorkerImpl* impl = reinterpret_cast<WebWorkerImpl*>(workerObjectProxy); webWorker = impl->client()->createWorker(proxy); @@ -244,15 +243,14 @@ void WebWorkerClientImpl::postExceptionToWorkerObject(const WebString& errorMess return; } - bool handled = false; - handled = m_worker->dispatchEvent(ErrorEvent::create(errorMessage, - sourceURL, - lineNumber)); - if (!handled) + bool unhandled = m_worker->dispatchEvent(ErrorEvent::create(errorMessage, + sourceURL, + lineNumber)); + if (unhandled) m_scriptExecutionContext->reportException(errorMessage, lineNumber, sourceURL); } -void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int destinationId, +void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int destination, int sourceId, int messageType, int messageLevel, @@ -263,7 +261,6 @@ void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int destinationId, if (currentThread() != m_workerThreadId) { m_scriptExecutionContext->postTask(createCallbackTask(&postConsoleMessageToWorkerObjectTask, this, - destinationId, sourceId, messageType, messageLevel, @@ -273,14 +270,23 @@ void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int destinationId, return; } - m_scriptExecutionContext->addMessage(static_cast<MessageDestination>(destinationId), - static_cast<MessageSource>(sourceId), + m_scriptExecutionContext->addMessage(static_cast<MessageSource>(sourceId), static_cast<MessageType>(messageType), static_cast<MessageLevel>(messageLevel), String(message), lineNumber, String(sourceURL)); } +void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int sourceId, + int messageType, + int messageLevel, + const WebString& message, + int lineNumber, + const WebString& sourceURL) +{ + postConsoleMessageToWorkerObject(0, sourceId, messageType, messageLevel, message, lineNumber, sourceURL); +} + void WebWorkerClientImpl::confirmMessageFromWorkerObject(bool hasPendingActivity) { // unconfirmed_message_count_ can only be updated on the thread where it's @@ -354,7 +360,7 @@ void WebWorkerClientImpl::postMessageToWorkerObjectTask( if (thisPtr->m_worker) { OwnPtr<MessagePortArray> ports = - MessagePort::entanglePorts(*context, channels.release()); + MessagePort::entanglePorts(*context, channels); RefPtr<SerializedScriptValue> serializedMessage = SerializedScriptValue::createFromWire(message); thisPtr->m_worker->dispatchEvent(MessageEvent::create(ports.release(), @@ -382,7 +388,6 @@ void WebWorkerClientImpl::postExceptionToWorkerObjectTask( void WebWorkerClientImpl::postConsoleMessageToWorkerObjectTask(ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr, - int destinationId, int sourceId, int messageType, int messageLevel, @@ -390,8 +395,7 @@ void WebWorkerClientImpl::postConsoleMessageToWorkerObjectTask(ScriptExecutionCo int lineNumber, const String& sourceURL) { - thisPtr->m_scriptExecutionContext->addMessage(static_cast<MessageDestination>(destinationId), - static_cast<MessageSource>(sourceId), + thisPtr->m_scriptExecutionContext->addMessage(static_cast<MessageSource>(sourceId), static_cast<MessageType>(messageType), static_cast<MessageLevel>(messageLevel), message, lineNumber, diff --git a/WebKit/chromium/src/WebWorkerClientImpl.h b/WebKit/chromium/src/WebWorkerClientImpl.h index 63acebc..0604823 100644 --- a/WebKit/chromium/src/WebWorkerClientImpl.h +++ b/WebKit/chromium/src/WebWorkerClientImpl.h @@ -33,9 +33,8 @@ #if ENABLE(WORKERS) -// FIXME: fix to just "WebWorkerClient.h" once nobody in glue depends on us. -#include "../public/WebWorkerClient.h" - +#include "WebFileSystem.h" +#include "WebWorkerClient.h" #include "WorkerContextProxy.h" #include <wtf/PassOwnPtr.h> #include <wtf/RefPtr.h> @@ -65,8 +64,8 @@ public: // process, this will be the main WebKit thread. In the worker process, this // will be the thread of the executing worker (not the main WebKit thread). virtual void startWorkerContext(const WebCore::KURL&, - const WebCore::String&, - const WebCore::String&); + const WTF::String&, + const WTF::String&); virtual void terminateWorkerContext(); virtual void postMessageToWorkerContext( PassRefPtr<WebCore::SerializedScriptValue> message, @@ -78,8 +77,12 @@ public: // These are called on the main WebKit thread. virtual void postMessageToWorkerObject(const WebString&, const WebMessagePortChannelArray&); virtual void postExceptionToWorkerObject(const WebString&, int, const WebString&); - virtual void postConsoleMessageToWorkerObject(int, int, int, int, const WebString&, - int, const WebString&); + + // FIXME: the below is for compatibility only and should be + // removed once Chromium is updated to remove message + // destination parameter <http://webkit.org/b/37155>. + virtual void postConsoleMessageToWorkerObject(int, int, int, int, const WebString&, int, const WebString&); + virtual void postConsoleMessageToWorkerObject(int, int, int, const WebString&, int, const WebString&); virtual void confirmMessageFromWorkerObject(bool); virtual void reportPendingActivity(bool); virtual void workerContextClosed(); @@ -90,6 +93,16 @@ public: // FIXME: Notifications not yet supported in workers. return 0; } + virtual WebApplicationCacheHost* createApplicationCacheHost(WebApplicationCacheHostClient*) { return 0; } + virtual bool allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize) + { + ASSERT_NOT_REACHED(); + return true; + } + virtual void openFileSystem(WebFrame*, WebFileSystem::Type, long long size, WebFileSystemCallbacks*) + { + ASSERT_NOT_REACHED(); + } private: virtual ~WebWorkerClientImpl(); @@ -99,14 +112,14 @@ private: // These tasks are dispatched on the WebKit thread. static void startWorkerContextTask(WebCore::ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr, - const WebCore::String& scriptURL, - const WebCore::String& userAgent, - const WebCore::String& sourceCode); + const WTF::String& scriptURL, + const WTF::String& userAgent, + const WTF::String& sourceCode); static void terminateWorkerContextTask(WebCore::ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr); static void postMessageToWorkerContextTask(WebCore::ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr, - const WebCore::String& message, + const WTF::String& message, PassOwnPtr<WebCore::MessagePortChannelArray> channels); static void workerObjectDestroyedTask(WebCore::ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr); @@ -116,22 +129,21 @@ private: // worker process). static void postMessageToWorkerObjectTask(WebCore::ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr, - const WebCore::String& message, + const WTF::String& message, PassOwnPtr<WebCore::MessagePortChannelArray> channels); static void postExceptionToWorkerObjectTask(WebCore::ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr, - const WebCore::String& message, + const WTF::String& message, int lineNumber, - const WebCore::String& sourceURL); + const WTF::String& sourceURL); static void postConsoleMessageToWorkerObjectTask(WebCore::ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr, - int destinationId, int sourceId, int messageType, int messageLevel, - const WebCore::String& message, + const WTF::String& message, int lineNumber, - const WebCore::String& sourceURL); + const WTF::String& sourceURL); static void confirmMessageFromWorkerObjectTask(WebCore::ScriptExecutionContext* context, WebWorkerClientImpl* thisPtr); static void reportPendingActivityTask(WebCore::ScriptExecutionContext* context, diff --git a/WebKit/chromium/src/WebWorkerImpl.cpp b/WebKit/chromium/src/WebWorkerImpl.cpp index 5b5e053..165af68 100644 --- a/WebKit/chromium/src/WebWorkerImpl.cpp +++ b/WebKit/chromium/src/WebWorkerImpl.cpp @@ -31,9 +31,9 @@ #include "config.h" #include "WebWorkerImpl.h" +#include "CrossThreadTask.h" #include "DedicatedWorkerContext.h" #include "DedicatedWorkerThread.h" -#include "GenericWorkerTask.h" #include "KURL.h" #include "MessageEvent.h" #include "MessagePort.h" @@ -86,7 +86,7 @@ void WebWorkerImpl::postMessageToWorkerContextTask(WebCore::ScriptExecutionConte static_cast<DedicatedWorkerContext*>(context); OwnPtr<MessagePortArray> ports = - MessagePort::entanglePorts(*context, channels.release()); + MessagePort::entanglePorts(*context, channels); RefPtr<SerializedScriptValue> serializedMessage = SerializedScriptValue::createFromWire(message); workerContext->dispatchEvent(MessageEvent::create( diff --git a/WebKit/chromium/src/WebWorkerImpl.h b/WebKit/chromium/src/WebWorkerImpl.h index bec96cd..d2fd016 100644 --- a/WebKit/chromium/src/WebWorkerImpl.h +++ b/WebKit/chromium/src/WebWorkerImpl.h @@ -69,7 +69,7 @@ private: static void postMessageToWorkerContextTask( WebCore::ScriptExecutionContext* context, WebWorkerImpl* thisPtr, - const WebCore::String& message, + const WTF::String& message, PassOwnPtr<WebCore::MessagePortChannelArray> channels); WebWorkerClient* m_client; diff --git a/WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp b/WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp new file mode 100644 index 0000000..058e947 --- /dev/null +++ b/WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WorkerAsyncFileSystemChromium.h" + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileSystemCallbacks.h" +#include "FileMetadata.h" +#include "FileSystem.h" +#include "NotImplemented.h" +#include "WebFileSystem.h" +#include "WebFileSystemCallbacksImpl.h" +#include "WebFileWriter.h" +#include "WebKit.h" +#include "WebKitClient.h" +#include "WebWorkerBase.h" +#include "WorkerAsyncFileWriterChromium.h" +#include "WorkerContext.h" +#include "WorkerFileSystemCallbacksBridge.h" +#include "WorkerScriptController.h" +#include "WorkerThread.h" +#include <wtf/text/CString.h> + +using namespace WebKit; + +namespace WebCore { + +static const char fileSystemOperationsMode[] = "fileSystemOperationsMode"; + +WorkerAsyncFileSystemChromium::WorkerAsyncFileSystemChromium(ScriptExecutionContext* context, const String& rootPath, bool synchronous) + : AsyncFileSystem(rootPath) + , m_scriptExecutionContext(context) + , m_webFileSystem(WebKit::webKitClient()->fileSystem()) + , m_workerContext(static_cast<WorkerContext*>(context)) + , m_synchronous(synchronous) +{ + ASSERT(m_webFileSystem); + ASSERT(m_scriptExecutionContext->isWorkerContext()); + + WorkerLoaderProxy* workerLoaderProxy = &m_workerContext->thread()->workerLoaderProxy(); + m_worker = static_cast<WebWorkerBase*>(workerLoaderProxy); +} + +WorkerAsyncFileSystemChromium::~WorkerAsyncFileSystemChromium() +{ +} + +bool WorkerAsyncFileSystemChromium::waitForOperationToComplete() +{ + if (!m_bridgeForCurrentOperation.get()) + return false; + + RefPtr<WorkerFileSystemCallbacksBridge> bridge = m_bridgeForCurrentOperation.release(); + if (m_workerContext->thread()->runLoop().runInMode(m_workerContext, m_modeForCurrentOperation) == MessageQueueTerminated) { + bridge->stop(); + return false; + } + return true; +} + +void WorkerAsyncFileSystemChromium::move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postMoveToMainThread(m_webFileSystem, sourcePath, destinationPath, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postCopyToMainThread(m_webFileSystem, sourcePath, destinationPath, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postRemoveToMainThread(m_webFileSystem, path, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postRemoveRecursivelyToMainThread(m_webFileSystem, path, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postReadMetadataToMainThread(m_webFileSystem, path, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postCreateFileToMainThread(m_webFileSystem, path, exclusive, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postCreateDirectoryToMainThread(m_webFileSystem, path, exclusive, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postFileExistsToMainThread(m_webFileSystem, path, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postDirectoryExistsToMainThread(m_webFileSystem, path, m_modeForCurrentOperation); +} + +void WorkerAsyncFileSystemChromium::readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(callbacks)->postReadDirectoryToMainThread(m_webFileSystem, path, m_modeForCurrentOperation); +} + +class WorkerFileWriterHelperCallbacks : public AsyncFileSystemCallbacks { +public: + static PassOwnPtr<WorkerFileWriterHelperCallbacks> create(AsyncFileWriterClient* client, const String& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks, WorkerContext* workerContext) + { + return adoptPtr(new WorkerFileWriterHelperCallbacks(client, path, webFileSystem, callbacks, workerContext)); + } + + virtual void didSucceed() + { + ASSERT_NOT_REACHED(); + } + + virtual void didReadMetadata(const FileMetadata& metadata) + { + ASSERT(m_callbacks); + if (metadata.type != FileMetadata::TypeFile || metadata.length < 0) + m_callbacks->didFail(WebKit::WebFileErrorInvalidState); + else { + OwnPtr<WorkerAsyncFileWriterChromium> asyncFileWriterChromium = WorkerAsyncFileWriterChromium::create(m_webFileSystem, m_path, m_workerContext, m_client, WorkerAsyncFileWriterChromium::Asynchronous); + m_callbacks->didCreateFileWriter(asyncFileWriterChromium.release(), metadata.length); + } + } + + virtual void didReadDirectoryEntry(const String& name, bool isDirectory) + { + ASSERT_NOT_REACHED(); + } + + virtual void didReadDirectoryEntries(bool hasMore) + { + ASSERT_NOT_REACHED(); + } + + virtual void didOpenFileSystem(const String&, PassOwnPtr<AsyncFileSystem>) + { + ASSERT_NOT_REACHED(); + } + + // Called when an AsyncFileWrter has been created successfully. + virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long) + { + ASSERT_NOT_REACHED(); + } + + virtual void didFail(int code) + { + ASSERT(m_callbacks); + m_callbacks->didFail(code); + } + +private: + WorkerFileWriterHelperCallbacks(AsyncFileWriterClient* client, const String& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks, WorkerContext* workerContext) + : m_client(client) + , m_path(path) + , m_webFileSystem(webFileSystem) + , m_callbacks(callbacks) + , m_workerContext(workerContext) + { + } + + AsyncFileWriterClient* m_client; + String m_path; + WebKit::WebFileSystem* m_webFileSystem; + OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks; + WorkerContext* m_workerContext; +}; + +void WorkerAsyncFileSystemChromium::createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + createWorkerFileSystemCallbacksBridge(WorkerFileWriterHelperCallbacks::create(client, path, m_webFileSystem, callbacks, m_workerContext))->postReadMetadataToMainThread(m_webFileSystem, path, m_modeForCurrentOperation); +} + +PassRefPtr<WorkerFileSystemCallbacksBridge> WorkerAsyncFileSystemChromium::createWorkerFileSystemCallbacksBridge(PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + ASSERT(!m_synchronous || !m_bridgeForCurrentOperation.get()); + + m_modeForCurrentOperation = fileSystemOperationsMode; + m_modeForCurrentOperation.append(String::number(m_workerContext->thread()->runLoop().createUniqueId())); + + m_bridgeForCurrentOperation = WorkerFileSystemCallbacksBridge::create(m_worker, m_scriptExecutionContext, new WebKit::WebFileSystemCallbacksImpl(callbacks)); + return m_bridgeForCurrentOperation; +} + +} // namespace WebCore + +#endif // ENABLE(FILE_SYSTEM) diff --git a/WebKit/chromium/src/WorkerAsyncFileSystemChromium.h b/WebKit/chromium/src/WorkerAsyncFileSystemChromium.h new file mode 100644 index 0000000..0b4b708 --- /dev/null +++ b/WebKit/chromium/src/WorkerAsyncFileSystemChromium.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WorkerAsyncFileSystemChromium_h +#define WorkerAsyncFileSystemChromium_h + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileSystem.h" +#include "PlatformString.h" +#include <wtf/PassOwnPtr.h> +#include <wtf/RefPtr.h> + +namespace WebKit { +class WebFileSystem; +class WebWorkerBase; +class WorkerFileSystemCallbacksBridge; +} + +namespace WebCore { + +class AsyncFileSystemCallbacks; +class ScriptExecutionContext; +class WorkerContext; + +class WorkerAsyncFileSystemChromium : public AsyncFileSystem { +public: + static PassOwnPtr<AsyncFileSystem> create(ScriptExecutionContext* context, const String& rootPath, bool synchronous) + { + return adoptPtr(new WorkerAsyncFileSystemChromium(context, rootPath, synchronous)); + } + + virtual ~WorkerAsyncFileSystemChromium(); + + // Runs one pending operation (to wait for completion in the sync-mode). + virtual bool waitForOperationToComplete(); + + virtual void move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks>); + +private: + WorkerAsyncFileSystemChromium(ScriptExecutionContext*, const String& rootPath, bool synchronous); + + PassRefPtr<WebKit::WorkerFileSystemCallbacksBridge> createWorkerFileSystemCallbacksBridge(PassOwnPtr<AsyncFileSystemCallbacks>); + + ScriptExecutionContext* m_scriptExecutionContext; + WebKit::WebFileSystem* m_webFileSystem; + WebKit::WebWorkerBase* m_worker; + WorkerContext* m_workerContext; + RefPtr<WebKit::WorkerFileSystemCallbacksBridge> m_bridgeForCurrentOperation; + String m_modeForCurrentOperation; + bool m_synchronous; +}; + +} // namespace WebCore + +#endif // ENABLE(FILE_SYSTEM) + +#endif // WorkerAsyncFileSystemChromium_h diff --git a/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp new file mode 100644 index 0000000..0d0ac8b --- /dev/null +++ b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WorkerAsyncFileWriterChromium.h" + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileSystem.h" +#include "Blob.h" +#include "ScriptExecutionContext.h" +#include "WebFileSystem.h" +#include "WebFileWriter.h" +#include "WebURL.h" +#include "WebWorkerBase.h" +#include "WorkerContext.h" +#include "WorkerFileWriterCallbacksBridge.h" +#include "WorkerLoaderProxy.h" +#include "WorkerThread.h" +#include <wtf/Assertions.h> + +using namespace WebKit; + +namespace WebCore { + +WorkerAsyncFileWriterChromium::WorkerAsyncFileWriterChromium(WebFileSystem* webFileSystem, const String& path, WorkerContext* workerContext, AsyncFileWriterClient* client, WriterType type) + : m_type(type) +{ + ASSERT(m_type == Asynchronous); // Synchronous is not implemented yet. + + WorkerLoaderProxy* proxy = &workerContext->thread()->workerLoaderProxy(); + m_bridge = WorkerFileWriterCallbacksBridge::create(path, proxy, workerContext, client); +} + +WorkerAsyncFileWriterChromium::~WorkerAsyncFileWriterChromium() +{ + m_bridge->postShutdownToMainThread(m_bridge); +} + +bool WorkerAsyncFileWriterChromium::waitForOperationToComplete() +{ + return m_bridge->waitForOperationToComplete(); +} + +void WorkerAsyncFileWriterChromium::write(long long position, Blob* data) +{ + m_bridge->postWriteToMainThread(position, data->url()); +} + +void WorkerAsyncFileWriterChromium::truncate(long long length) +{ + m_bridge->postTruncateToMainThread(length); +} + +void WorkerAsyncFileWriterChromium::abort() +{ + m_bridge->postAbortToMainThread(); +} + +} + +#endif // ENABLE(FILE_SYSTEM) diff --git a/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h new file mode 100644 index 0000000..01058c3 --- /dev/null +++ b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WorkerAsyncFileWriterChromium_h +#define WorkerAsyncFileWriterChromium_h + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileWriter.h" +#include <wtf/PassOwnPtr.h> + +namespace WebKit { + class WebFileSystem; + class WebFileWriter; + class WorkerFileWriterCallbacksBridge; +} + +namespace WTF { + class String; +} +using WTF::String; + +namespace WebCore { + +class AsyncFileSystem; +class AsyncFileWriterClient; +class Blob; +class WorkerContext; + +class WorkerAsyncFileWriterChromium : public AsyncFileWriter { +public: + enum WriterType { + Asynchronous, + Synchronous, + }; + + static PassOwnPtr<WorkerAsyncFileWriterChromium> create(WebKit::WebFileSystem* webFileSystem, const String& path, WorkerContext* workerContext, AsyncFileWriterClient* client, WriterType type) + { + return adoptPtr(new WorkerAsyncFileWriterChromium(webFileSystem, path, workerContext, client, type)); + } + ~WorkerAsyncFileWriterChromium(); + + bool waitForOperationToComplete(); + + // FileWriter + virtual void write(long long position, Blob* data); + virtual void truncate(long long length); + virtual void abort(); + +private: + + WorkerAsyncFileWriterChromium(WebKit::WebFileSystem*, const String& path, WorkerContext*, AsyncFileWriterClient*, WriterType); + RefPtr<WebKit::WorkerFileWriterCallbacksBridge> m_bridge; + WriterType m_type; +}; + +} // namespace + +#endif // ENABLE(FILE_SYSTEM) + +#endif // AsyncFileWriterChromium_h diff --git a/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.cpp b/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.cpp new file mode 100644 index 0000000..6c31221 --- /dev/null +++ b/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.cpp @@ -0,0 +1,392 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WorkerFileSystemCallbacksBridge.h" + +#if ENABLE(FILE_SYSTEM) + +#include "CrossThreadTask.h" +#include "WebCommonWorkerClient.h" +#include "WebFileInfo.h" +#include "WebFileSystemCallbacks.h" +#include "WebFileSystemEntry.h" +#include "WebString.h" +#include "WebWorkerBase.h" +#include "WorkerContext.h" +#include "WorkerScriptController.h" +#include "WorkerThread.h" +#include <wtf/MainThread.h> +#include <wtf/Threading.h> + +namespace WebCore { + +template<> struct CrossThreadCopierBase<false, false, WebKit::WebFileInfo> { + typedef WebKit::WebFileInfo Type; + static Type copy(const WebKit::WebFileInfo& info) + { + // Perform per-field copy to make sure we don't do any (unexpected) non-thread safe copy here. + struct WebKit::WebFileInfo newInfo; + newInfo.modificationTime = info.modificationTime; + newInfo.length = info.length; + newInfo.type = info.type; + return newInfo; + } +}; + +template<> struct CrossThreadCopierBase<false, false, WebKit::WebVector<WebKit::WebFileSystemEntry> > { + typedef WebKit::WebVector<WebKit::WebFileSystemEntry> Type; + static Type copy(const WebKit::WebVector<WebKit::WebFileSystemEntry>& entries) + { + WebKit::WebVector<WebKit::WebFileSystemEntry> newEntries(entries.size()); + for (size_t i = 0; i < entries.size(); ++i) { + String name = entries[i].name; + newEntries[i].isDirectory = entries[i].isDirectory; + newEntries[i].name = name.crossThreadString(); + } + return newEntries; + } +}; + +} + +using namespace WebCore; + +namespace WebKit { + +// FileSystemCallbacks that are to be dispatched on the main thread. +class MainThreadFileSystemCallbacks : public WebFileSystemCallbacks { +public: + // Callbacks are self-destructed and we always return leaked pointer here. + static MainThreadFileSystemCallbacks* createLeakedPtr(PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const String& mode) + { + OwnPtr<MainThreadFileSystemCallbacks> callbacks = adoptPtr(new MainThreadFileSystemCallbacks(bridge, mode)); + return callbacks.leakPtr(); + } + + virtual ~MainThreadFileSystemCallbacks() + { + } + + virtual void didOpenFileSystem(const WebString& name, const WebString& path) + { + m_bridge->didOpenFileSystemOnMainThread(name, path, m_mode); + delete this; + } + + virtual void didFail(WebFileError error) + { + m_bridge->didFailOnMainThread(error, m_mode); + delete this; + } + + virtual void didSucceed() + { + m_bridge->didSucceedOnMainThread(m_mode); + delete this; + } + + virtual void didReadMetadata(const WebFileInfo& info) + { + m_bridge->didReadMetadataOnMainThread(info, m_mode); + delete this; + } + + virtual void didReadDirectory(const WebVector<WebFileSystemEntry>& entries, bool hasMore) + { + m_bridge->didReadDirectoryOnMainThread(entries, hasMore, m_mode); + delete this; + } + +private: + MainThreadFileSystemCallbacks(PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const String& mode) + : m_bridge(bridge) + , m_mode(mode) + { + ASSERT(m_bridge.get()); + } + + friend class WorkerFileSystemCallbacksBridge; + RefPtr<WorkerFileSystemCallbacksBridge> m_bridge; + const String m_mode; +}; + +void WorkerFileSystemCallbacksBridge::stop() +{ + ASSERT(m_workerContext->isContextThread()); + MutexLocker locker(m_mutex); + m_worker = 0; + + if (m_callbacksOnWorkerThread) { + m_callbacksOnWorkerThread->didFail(WebFileErrorAbort); + m_callbacksOnWorkerThread = 0; + } +} + +void WorkerFileSystemCallbacksBridge::postOpenFileSystemToMainThread(WebCommonWorkerClient* commonClient, WebFileSystem::Type type, long long size, const String& mode) +{ + dispatchTaskToMainThread(createCallbackTask(&openFileSystemOnMainThread, commonClient, type, size, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postMoveToMainThread(WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, const String& mode) +{ + dispatchTaskToMainThread(createCallbackTask(&moveOnMainThread, fileSystem, sourcePath, destinationPath, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postCopyToMainThread(WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, const String& mode) +{ + dispatchTaskToMainThread(createCallbackTask(©OnMainThread, fileSystem, sourcePath, destinationPath, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postRemoveToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode) +{ + ASSERT(fileSystem); + dispatchTaskToMainThread(createCallbackTask(&removeOnMainThread, fileSystem, path, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postRemoveRecursivelyToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode) +{ + ASSERT(fileSystem); + dispatchTaskToMainThread(createCallbackTask(&removeRecursivelyOnMainThread, fileSystem, path, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postReadMetadataToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode) +{ + ASSERT(fileSystem); + dispatchTaskToMainThread(createCallbackTask(&readMetadataOnMainThread, fileSystem, path, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postCreateFileToMainThread(WebFileSystem* fileSystem, const String& path, bool exclusive, const String& mode) +{ + dispatchTaskToMainThread(createCallbackTask(&createFileOnMainThread, fileSystem, path, exclusive, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postCreateDirectoryToMainThread(WebFileSystem* fileSystem, const String& path, bool exclusive, const String& mode) +{ + ASSERT(fileSystem); + dispatchTaskToMainThread(createCallbackTask(&createDirectoryOnMainThread, fileSystem, path, exclusive, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postFileExistsToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode) +{ + ASSERT(fileSystem); + dispatchTaskToMainThread(createCallbackTask(&fileExistsOnMainThread, fileSystem, path, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postDirectoryExistsToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode) +{ + ASSERT(fileSystem); + dispatchTaskToMainThread(createCallbackTask(&directoryExistsOnMainThread, fileSystem, path, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::postReadDirectoryToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode) +{ + ASSERT(fileSystem); + dispatchTaskToMainThread(createCallbackTask(&readDirectoryOnMainThread, fileSystem, path, this, mode)); +} + +void WorkerFileSystemCallbacksBridge::openFileSystemOnMainThread(ScriptExecutionContext*, WebCommonWorkerClient* commonClient, WebFileSystem::Type type, long long size, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + if (!commonClient) + bridge->didFailOnMainThread(WebFileErrorAbort, mode); + else { + commonClient->openFileSystem(type, size, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); + } +} + +void WorkerFileSystemCallbacksBridge::moveOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->move(sourcePath, destinationPath, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::copyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->copy(sourcePath, destinationPath, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::removeOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->remove(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::removeRecursivelyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->removeRecursively(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::readMetadataOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->readMetadata(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::createFileOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->createFile(path, exclusive, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::createDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->createDirectory(path, exclusive, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::fileExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->fileExists(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::directoryExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->directoryExists(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::readDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode) +{ + fileSystem->readDirectory(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode)); +} + +void WorkerFileSystemCallbacksBridge::didFailOnMainThread(WebFileError error, const String& mode) +{ + mayPostTaskToWorker(createCallbackTask(&didFailOnWorkerThread, this, error), mode); +} + +void WorkerFileSystemCallbacksBridge::didOpenFileSystemOnMainThread(const String& name, const String& rootPath, const String& mode) +{ + mayPostTaskToWorker(createCallbackTask(&didOpenFileSystemOnWorkerThread, this, name, rootPath), mode); +} + +void WorkerFileSystemCallbacksBridge::didSucceedOnMainThread(const String& mode) +{ + mayPostTaskToWorker(createCallbackTask(&didSucceedOnWorkerThread, this), mode); +} + +void WorkerFileSystemCallbacksBridge::didReadMetadataOnMainThread(const WebFileInfo& info, const String& mode) +{ + mayPostTaskToWorker(createCallbackTask(&didReadMetadataOnWorkerThread, this, info), mode); +} + +void WorkerFileSystemCallbacksBridge::didReadDirectoryOnMainThread(const WebVector<WebFileSystemEntry>& entries, bool hasMore, const String& mode) +{ + mayPostTaskToWorker(createCallbackTask(&didReadDirectoryOnWorkerThread, this, entries, hasMore), mode); +} + +WorkerFileSystemCallbacksBridge::WorkerFileSystemCallbacksBridge(WebWorkerBase* worker, ScriptExecutionContext* scriptExecutionContext, WebFileSystemCallbacks* callbacks) + : WorkerContext::Observer(static_cast<WorkerContext*>(scriptExecutionContext)) + , m_worker(worker) + , m_workerContext(scriptExecutionContext) + , m_callbacksOnWorkerThread(callbacks) +{ + ASSERT(m_workerContext->isContextThread()); +} + +WorkerFileSystemCallbacksBridge::~WorkerFileSystemCallbacksBridge() +{ + ASSERT(!m_callbacksOnWorkerThread); +} + +void WorkerFileSystemCallbacksBridge::didFailOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, WebFileError error) +{ + bridge->m_callbacksOnWorkerThread->didFail(error); +} + +void WorkerFileSystemCallbacksBridge::didOpenFileSystemOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const String& name, const String& rootPath) +{ + bridge->m_callbacksOnWorkerThread->didOpenFileSystem(name, rootPath); +} + +void WorkerFileSystemCallbacksBridge::didSucceedOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge) +{ + bridge->m_callbacksOnWorkerThread->didSucceed(); +} + +void WorkerFileSystemCallbacksBridge::didReadMetadataOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const WebFileInfo& info) +{ + bridge->m_callbacksOnWorkerThread->didReadMetadata(info); +} + +void WorkerFileSystemCallbacksBridge::didReadDirectoryOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const WebVector<WebFileSystemEntry>& entries, bool hasMore) +{ + bridge->m_callbacksOnWorkerThread->didReadDirectory(entries, hasMore); +} + +bool WorkerFileSystemCallbacksBridge::derefIfWorkerIsStopped() +{ + WebWorkerBase* worker = 0; + { + MutexLocker locker(m_mutex); + worker = m_worker; + } + + if (!worker) { + m_selfRef.clear(); + return true; + } + return false; +} + +void WorkerFileSystemCallbacksBridge::runTaskOnMainThread(WebCore::ScriptExecutionContext* scriptExecutionContext, WorkerFileSystemCallbacksBridge* bridge, PassOwnPtr<WebCore::ScriptExecutionContext::Task> taskToRun) +{ + ASSERT(isMainThread()); + if (bridge->derefIfWorkerIsStopped()) + return; + taskToRun->performTask(scriptExecutionContext); +} + +void WorkerFileSystemCallbacksBridge::runTaskOnWorkerThread(WebCore::ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, PassOwnPtr<WebCore::ScriptExecutionContext::Task> taskToRun) +{ + if (!bridge->m_callbacksOnWorkerThread) + return; + ASSERT(bridge->m_workerContext->isContextThread()); + taskToRun->performTask(scriptExecutionContext); + bridge->m_callbacksOnWorkerThread = 0; +} + +void WorkerFileSystemCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task> task) +{ + ASSERT(!m_selfRef); + ASSERT(m_worker); + ASSERT(m_workerContext->isContextThread()); + m_selfRef = this; + m_worker->dispatchTaskToMainThread(createCallbackTask(&runTaskOnMainThread, this, task)); +} + +void WorkerFileSystemCallbacksBridge::mayPostTaskToWorker(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode) +{ + ASSERT(isMainThread()); + { // Let go of the mutex before possibly deleting this due to m_selfRef.clear(). + MutexLocker locker(m_mutex); + if (m_worker) + m_worker->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, m_selfRef, task), mode); + } + m_selfRef.clear(); +} + +} // namespace WebCore + +#endif // ENABLE(FILE_SYSTEM) diff --git a/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.h b/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.h new file mode 100644 index 0000000..fa57f38 --- /dev/null +++ b/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WorkerFileSystemCallbacksBridge_h +#define WorkerFileSystemCallbacksBridge_h + +#if ENABLE(FILE_SYSTEM) + +#include "PlatformString.h" +#include "ScriptExecutionContext.h" +#include "WebFileError.h" +#include "WebFileSystem.h" +#include "WebVector.h" +#include "WorkerContext.h" +#include <wtf/PassOwnPtr.h> +#include <wtf/PassRefPtr.h> +#include <wtf/Threading.h> + +namespace WebKit { + +class AsyncFileSystem; +class MainThreadFileSystemCallbacks; +class ThreadableCallbacksBridgeWrapper; +class WebCommonWorkerClient; +class WebFileSystemCallbacks; +class WebWorkerBase; +struct WebFileInfo; +struct WebFileSystemEntry; + +// This class is used to post a openFileSystem request to the main thread and get called back for the request. This must be destructed on the worker thread. +// +// A typical flow for openFileSystem would look like this: +// Bridge::postOpenFileSystemToMainThread() on WorkerThread +// --> Bridge::openFileSystemOnMainThread() is called on MainThread +// This makes an IPC with a MainThreadFileSystemCallbacks instance +// [actual operation is down in the browser] +// --> MainThreadFileSystemCallbacks::didXxx is called on MainThread +// --> Bridge::didXxxOnMainThread is called on MainThread +// --> Bridge::didXxxOnWorkerThread is called on WorkerThread +// This calls the original callbacks (m_callbacksOnWorkerThread) and +// releases a self-reference to the bridge. +class WorkerFileSystemCallbacksBridge : public ThreadSafeShared<WorkerFileSystemCallbacksBridge>, public WebCore::WorkerContext::Observer { +public: + ~WorkerFileSystemCallbacksBridge(); + + // WorkerContext::Observer method. + virtual void notifyStop() + { + stop(); + } + + void stop(); + + static PassRefPtr<WorkerFileSystemCallbacksBridge> create(WebWorkerBase* worker, WebCore::ScriptExecutionContext* workerContext, WebFileSystemCallbacks* callbacks) + { + return adoptRef(new WorkerFileSystemCallbacksBridge(worker, workerContext, callbacks)); + } + + // Methods that create an instance and post an initial request task to the main thread. They must be called on the worker thread. + void postOpenFileSystemToMainThread(WebCommonWorkerClient*, WebFileSystem::Type, long long size, const String& mode); + void postMoveToMainThread(WebFileSystem*, const String& srcPath, const String& destPath, const String& mode); + void postCopyToMainThread(WebFileSystem*, const String& srcPath, const String& destPath, const String& mode); + void postRemoveToMainThread(WebFileSystem*, const String& path, const String& mode); + void postRemoveRecursivelyToMainThread(WebFileSystem*, const String& path, const String& mode); + void postReadMetadataToMainThread(WebFileSystem*, const String& path, const String& mode); + void postCreateFileToMainThread(WebFileSystem*, const String& path, bool exclusive, const String& mode); + void postCreateDirectoryToMainThread(WebFileSystem*, const String& path, bool exclusive, const String& mode); + void postFileExistsToMainThread(WebFileSystem*, const String& path, const String& mode); + void postDirectoryExistsToMainThread(WebFileSystem*, const String& path, const String& mode); + void postReadDirectoryToMainThread(WebFileSystem*, const String& path, const String& mode); + + // Callback methods that are called on the main thread. + void didFailOnMainThread(WebFileError, const String& mode); + void didOpenFileSystemOnMainThread(const String& name, const String& rootPath, const String& mode); + void didSucceedOnMainThread(const String& mode); + void didReadMetadataOnMainThread(const WebFileInfo&, const String& mode); + void didReadDirectoryOnMainThread(const WebVector<WebFileSystemEntry>&, bool hasMore, const String& mode); + +private: + WorkerFileSystemCallbacksBridge(WebWorkerBase*, WebCore::ScriptExecutionContext*, WebFileSystemCallbacks*); + + // Methods that are to be called on the main thread. + static void openFileSystemOnMainThread(WebCore::ScriptExecutionContext*, WebCommonWorkerClient*, WebFileSystem::Type, long long size, WorkerFileSystemCallbacksBridge*, const String& mode); + static void moveOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& srcPath, const String& destPath, WorkerFileSystemCallbacksBridge*, const String& mode); + static void copyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& srcPath, const String& destPath, WorkerFileSystemCallbacksBridge*, const String& mode); + static void removeOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode); + static void removeRecursivelyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode); + static void readMetadataOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode); + static void createFileOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge*, const String& mode); + static void createDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge*, const String& mode); + static void fileExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode); + static void directoryExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode); + static void readDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode); + + friend class MainThreadFileSystemCallbacks; + + // Methods that dispatch WebFileSystemCallbacks on the worker threads. + // They release a selfRef of the WorkerFileSystemCallbacksBridge. + static void didFailOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, WebFileError); + static void didOpenFileSystemOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, const String& name, const String& rootPath); + static void didSucceedOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*); + static void didReadMetadataOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, const WebFileInfo&); + static void didReadDirectoryOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, const WebVector<WebFileSystemEntry>&, bool hasMore); + + // For early-exist; this deref's selfRef and returns true if the worker is already null. + bool derefIfWorkerIsStopped(); + + static void runTaskOnMainThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, PassOwnPtr<WebCore::ScriptExecutionContext::Task>); + static void runTaskOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileSystemCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::Task>); + + void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>); + void mayPostTaskToWorker(PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const String& mode); + + // m_selfRef keeps a reference to itself until a task is created for the worker thread (at which point the task holds the reference). + RefPtr<WorkerFileSystemCallbacksBridge> m_selfRef; + + Mutex m_mutex; + WebWorkerBase* m_worker; + WebCore::ScriptExecutionContext* m_workerContext; + + // This is self-destructed and must be fired on the worker thread. + WebFileSystemCallbacks* m_callbacksOnWorkerThread; +}; + +} // namespace WebCore + +#endif + +#endif // WorkerFileSystemCallbacksBridge_h diff --git a/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp new file mode 100644 index 0000000..179aea5 --- /dev/null +++ b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WorkerFileWriterCallbacksBridge.h" + +#if ENABLE(FILE_SYSTEM) + +#include "AsyncFileWriterClient.h" +#include "CrossThreadTask.h" +#include "WebCString.h" +#include "WebFileSystem.h" +#include "WebFileWriter.h" +#include "WebKit.h" +#include "WebKitClient.h" +#include "WebWorkerBase.h" +#include "WorkerContext.h" +#include "WorkerLoaderProxy.h" +#include "WorkerThread.h" +#include <wtf/MainThread.h> +#include <wtf/Threading.h> + +using namespace WebCore; + +namespace WebKit { + +void WorkerFileWriterCallbacksBridge::notifyStop() +{ + ASSERT(m_workerContext->isContextThread()); + m_clientOnWorkerThread = 0; +} + +void WorkerFileWriterCallbacksBridge::postWriteToMainThread(long long position, const KURL& data) +{ + ASSERT(!m_operationInProgress); + m_operationInProgress = true; + dispatchTaskToMainThread(createCallbackTask(&writeOnMainThread, this, position, data)); +} + +void WorkerFileWriterCallbacksBridge::postTruncateToMainThread(long long length) +{ + ASSERT(!m_operationInProgress); + m_operationInProgress = true; + dispatchTaskToMainThread(createCallbackTask(&truncateOnMainThread, this, length)); +} + +void WorkerFileWriterCallbacksBridge::postAbortToMainThread() +{ + ASSERT(m_operationInProgress); + dispatchTaskToMainThread(createCallbackTask(&abortOnMainThread, this)); +} + +void WorkerFileWriterCallbacksBridge::postShutdownToMainThread(PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) +{ + ASSERT(m_workerContext->isContextThread()); + m_clientOnWorkerThread = 0; + dispatchTaskToMainThread(createCallbackTask(&shutdownOnMainThread, bridge)); +} + +void WorkerFileWriterCallbacksBridge::writeOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long position, const KURL& data) +{ + bridge->m_writer->write(position, WebURL(data)); +} + +void WorkerFileWriterCallbacksBridge::truncateOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length) +{ + bridge->m_writer->truncate(length); +} + +void WorkerFileWriterCallbacksBridge::abortOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) +{ + bridge->m_writer->cancel(); +} + +void WorkerFileWriterCallbacksBridge::initOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, const String& path) +{ + ASSERT(!bridge->m_writer); + bridge->m_writer = webKitClient()->fileSystem()->createFileWriter(path, bridge.get()); +} + +void WorkerFileWriterCallbacksBridge::shutdownOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) +{ + bridge->m_writerDeleted = true; + bridge->m_writer.clear(); +} + +void WorkerFileWriterCallbacksBridge::didWrite(long long bytes, bool complete) +{ + dispatchTaskToWorkerThread(createCallbackTask(&didWriteOnWorkerThread, this, bytes, complete)); +} + +void WorkerFileWriterCallbacksBridge::didFail(WebFileError error) +{ + dispatchTaskToWorkerThread(createCallbackTask(&didFailOnWorkerThread, this, error)); +} + +void WorkerFileWriterCallbacksBridge::didTruncate() +{ + dispatchTaskToWorkerThread(createCallbackTask(&didTruncateOnWorkerThread, this)); +} + +static const char fileWriterOperationsMode[] = "fileWriterOperationsMode"; + +WorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge(const String& path, WorkerLoaderProxy* proxy, ScriptExecutionContext* scriptExecutionContext, AsyncFileWriterClient* client) + : WorkerContext::Observer(static_cast<WorkerContext*>(scriptExecutionContext)) + , m_proxy(proxy) + , m_workerContext(scriptExecutionContext) + , m_clientOnWorkerThread(client) + , m_writerDeleted(false) + , m_operationInProgress(false) +{ + ASSERT(m_workerContext->isContextThread()); + m_mode = fileWriterOperationsMode; + m_mode.append(String::number(static_cast<WorkerContext*>(scriptExecutionContext)->thread()->runLoop().createUniqueId())); + postInitToMainThread(path); +} + +void WorkerFileWriterCallbacksBridge::postInitToMainThread(const String& path) +{ + dispatchTaskToMainThread(createCallbackTask(&initOnMainThread, this, path)); +} + +WorkerFileWriterCallbacksBridge::~WorkerFileWriterCallbacksBridge() +{ + ASSERT(!m_clientOnWorkerThread); + ASSERT(!m_writer); +} + +// We know m_clientOnWorkerThread is still valid because it is only cleared on the context thread, and because we check in runTaskOnWorkerThread before calling any of these methods. +void WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length, bool complete) +{ + ASSERT(bridge->m_workerContext->isContextThread()); + ASSERT(bridge->m_operationInProgress); + if (complete) + bridge->m_operationInProgress = false; + bridge->m_clientOnWorkerThread->didWrite(length, complete); +} + +void WorkerFileWriterCallbacksBridge::didFailOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, WebFileError error) +{ + ASSERT(bridge->m_workerContext->isContextThread()); + ASSERT(bridge->m_operationInProgress); + bridge->m_operationInProgress = false; + bridge->m_clientOnWorkerThread->didFail(static_cast<FileError::ErrorCode>(error)); +} + +void WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) +{ + ASSERT(bridge->m_workerContext->isContextThread()); + ASSERT(bridge->m_operationInProgress); + bridge->m_operationInProgress = false; + bridge->m_clientOnWorkerThread->didTruncate(); +} + +void WorkerFileWriterCallbacksBridge::runTaskOnMainThread(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, PassOwnPtr<ScriptExecutionContext::Task> taskToRun) +{ + ASSERT(isMainThread()); + if (!bridge->m_writerDeleted) + taskToRun->performTask(scriptExecutionContext); +} + +void WorkerFileWriterCallbacksBridge::runTaskOnWorkerThread(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, PassOwnPtr<ScriptExecutionContext::Task> taskToRun) +{ + ASSERT(bridge->m_workerContext->isContextThread()); + if (bridge->m_clientOnWorkerThread) + taskToRun->performTask(scriptExecutionContext); +} + +void WorkerFileWriterCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<ScriptExecutionContext::Task> task) +{ + ASSERT(m_workerContext->isContextThread()); + WebWorkerBase::dispatchTaskToMainThread(createCallbackTask(&runTaskOnMainThread, this, task)); +} + +void WorkerFileWriterCallbacksBridge::dispatchTaskToWorkerThread(PassOwnPtr<ScriptExecutionContext::Task> task) +{ + ASSERT(isMainThread()); + m_proxy->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, this, task), m_mode); +} + +bool WorkerFileWriterCallbacksBridge::waitForOperationToComplete() +{ + while (m_operationInProgress) { + WorkerContext* context = static_cast<WorkerContext*>(m_workerContext); + if (context->thread()->runLoop().runInMode(context, m_mode) == MessageQueueTerminated) + return false; + } + return true; +} + +} // namespace WebKit + +#endif // ENABLE(FILE_SYSTEM) diff --git a/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h new file mode 100644 index 0000000..62e333c --- /dev/null +++ b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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. + */ + +#ifndef WorkerFileWriterCallbacksBridge_h +#define WorkerFileWriterCallbacksBridge_h + +#if ENABLE(FILE_SYSTEM) + +#include "WebFileError.h" +#include "WebFileWriterClient.h" +#include "WorkerContext.h" +#include <wtf/PassOwnPtr.h> +#include <wtf/PassRefPtr.h> +#include <wtf/ThreadSafeShared.h> + +namespace WebCore { + class AsyncFileWriterClient; + class KURL; + class WorkerLoaderProxy; +} + +namespace WTF { + class String; +} +using WTF::String; + +namespace WebKit { + +class WebFileSystem; +class WebFileWriter; +class WebFileWriterClient; +class WebWorkerBase; + +// This class is used as a mechanism to bridge calls between threads. +// Calls to a WebFileWriter must happen on the main thread, but they come from +// the context thread. The responses through the WebFileWriterClient interface +// start on the main thread, but must be sent via the worker context thread. +// +// A typical flow for write would look like this: +// Bridge::postWriteToMainThread() on WorkerThread +// --> Bridge::writeOnMainThread() is called on MainThread +// --> WebFileWriter::write() +// This makes an IPC; the actual operation is down in the browser. +// --> Bridge::didWrite is called on MainThread +// --> Bridge::didWriteOnWorkerThread is called on WorkerThread +// This calls the original client (m_clientOnWorkerThread). +// +// The bridge object is refcounted, so that it doesn't get deleted while there +// are cross-thread calls in flight. Each CrossThreadTask carries a reference +// to the bridge, which guarantees that the bridge will still be valid when the +// task is executed. In order to shut down the bridge, the WebFileWriterClient +// should call postShutdownToMainThread before dropping its reference to the +// bridge. This ensures that the WebFileWriter will be cleared on the main +// thread and that no further calls to the WebFileWriterClient will be made. +class WorkerFileWriterCallbacksBridge : public ThreadSafeShared<WorkerFileWriterCallbacksBridge>, public WebCore::WorkerContext::Observer, public WebFileWriterClient { +public: + ~WorkerFileWriterCallbacksBridge(); + + // WorkerContext::Observer method. + virtual void notifyStop(); + + static PassRefPtr<WorkerFileWriterCallbacksBridge> create(const String& path, WebCore::WorkerLoaderProxy* proxy, WebCore::ScriptExecutionContext* workerContext, WebCore::AsyncFileWriterClient* client) + { + return adoptRef(new WorkerFileWriterCallbacksBridge(path, proxy, workerContext, client)); + } + + // Methods that create an instance and post an initial request task to the main thread. They must be called on the worker thread. + void postWriteToMainThread(long long position, const WebCore::KURL& data); + void postTruncateToMainThread(long long length); + void postAbortToMainThread(); + + // The owning WorkerAsyncFileWriterChromium should call this method before dropping its last reference to the bridge, on the context thread. + // The actual deletion of the WorkerFileWriterCallbacksBridge may happen on either the main or context thread, depending on where the last reference goes away; that's safe as long as this is called first. + void postShutdownToMainThread(PassRefPtr<WorkerFileWriterCallbacksBridge>); + + // Callback methods that are called on the main thread. + // These are the implementation of WebKit::WebFileWriterClient. + void didWrite(long long bytes, bool complete); + void didFail(WebFileError); + void didTruncate(); + + // Call this on the context thread to wait for the current operation to complete. + bool waitForOperationToComplete(); + +private: + WorkerFileWriterCallbacksBridge(const String& path, WebCore::WorkerLoaderProxy*, WebCore::ScriptExecutionContext*, WebCore::AsyncFileWriterClient*); + + void postInitToMainThread(const String& path); + + // Methods that are to be called on the main thread. + static void writeOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long position, const WebCore::KURL& data); + static void truncateOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long length); + static void abortOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>); + static void initOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, const String& path); + static void shutdownOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>); + + // Methods that dispatch to AsyncFileWriterClient on the worker threads. + static void didWriteOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long length, bool complete); + static void didFailOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, WebFileError); + static void didTruncateOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>); + + // Called on the main thread to run the supplied task. + static void runTaskOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::Task>); + // Called on the worker thread to run the supplied task. + static void runTaskOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::Task>); + + // Called on the worker thread to dispatch to the main thread. + void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>); + // Called on the main thread to dispatch to the worker thread. + void dispatchTaskToWorkerThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>); + + // Used from the main thread to post tasks to the context thread. + WebCore::WorkerLoaderProxy* m_proxy; + + // Used on the context thread, only to check that we're running on the context thread. + WebCore::ScriptExecutionContext* m_workerContext; + + // Created and destroyed from the main thread. + OwnPtr<WebKit::WebFileWriter> m_writer; + + // Used on the context thread to call back into the client. + WebCore::AsyncFileWriterClient* m_clientOnWorkerThread; + + // Used to indicate that shutdown has started on the main thread, and hence the writer has been deleted. + bool m_writerDeleted; + + // Used by waitForOperationToComplete. + bool m_operationInProgress; + + // Used by postTaskForModeToWorkerContext and runInMode. + String m_mode; +}; + +} // namespace WebCore + +#endif + +#endif // WorkerFileWriterCallbacksBridge_h diff --git a/WebKit/chromium/src/WrappedResourceRequest.h b/WebKit/chromium/src/WrappedResourceRequest.h index 97311db..3057387 100644 --- a/WebKit/chromium/src/WrappedResourceRequest.h +++ b/WebKit/chromium/src/WrappedResourceRequest.h @@ -31,9 +31,7 @@ #ifndef WrappedResourceRequest_h #define WrappedResourceRequest_h -// FIXME: This relative path is a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebURLRequest.h" +#include "WebURLRequest.h" #include "WebURLRequestPrivate.h" namespace WebKit { diff --git a/WebKit/chromium/src/WrappedResourceResponse.h b/WebKit/chromium/src/WrappedResourceResponse.h index af4f88f..927582d 100644 --- a/WebKit/chromium/src/WrappedResourceResponse.h +++ b/WebKit/chromium/src/WrappedResourceResponse.h @@ -31,9 +31,7 @@ #ifndef WrappedResourceResponse_h #define WrappedResourceResponse_h -// FIXME: This relative path is a temporary hack to support using this -// header from webkit/glue. -#include "../public/WebURLResponse.h" +#include "WebURLResponse.h" #include "WebURLResponsePrivate.h" namespace WebKit { diff --git a/WebKit/chromium/src/gtk/WebFontInfo.cpp b/WebKit/chromium/src/gtk/WebFontInfo.cpp index 76ed618..dd25eb1 100644 --- a/WebKit/chromium/src/gtk/WebFontInfo.cpp +++ b/WebKit/chromium/src/gtk/WebFontInfo.cpp @@ -30,6 +30,7 @@ #include "config.h" #include "WebFontInfo.h" +#include "WebFontRenderStyle.h" #include <fontconfig/fontconfig.h> #include <string.h> @@ -55,11 +56,11 @@ WebCString WebFontInfo::familyForChars(const WebUChar* characters, size_t numCha FcValue fcvalue; fcvalue.type = FcTypeCharSet; fcvalue.u.c = cset; - FcPatternAdd(pattern, FC_CHARSET, fcvalue, 0); + FcPatternAdd(pattern, FC_CHARSET, fcvalue, FcFalse); fcvalue.type = FcTypeBool; fcvalue.u.b = FcTrue; - FcPatternAdd(pattern, FC_SCALABLE, fcvalue, 0); + FcPatternAdd(pattern, FC_SCALABLE, fcvalue, FcFalse); FcConfigSubstitute(0, pattern, FcMatchPattern); FcDefaultSubstitute(pattern); @@ -104,4 +105,85 @@ WebCString WebFontInfo::familyForChars(const WebUChar* characters, size_t numCha return WebCString(); } +void WebFontInfo::renderStyleForStrike(const char* family, int sizeAndStyle, WebFontRenderStyle* out) +{ + bool isBold = sizeAndStyle & 1; + bool isItalic = sizeAndStyle & 2; + int pixelSize = sizeAndStyle >> 2; + + FcPattern* pattern = FcPatternCreate(); + FcValue fcvalue; + + fcvalue.type = FcTypeString; + fcvalue.u.s = reinterpret_cast<const FcChar8 *>(family); + FcPatternAdd(pattern, FC_FAMILY, fcvalue, FcFalse); + + fcvalue.type = FcTypeInteger; + fcvalue.u.i = isBold ? FC_WEIGHT_BOLD : FC_WEIGHT_NORMAL; + FcPatternAdd(pattern, FC_WEIGHT, fcvalue, FcFalse); + + fcvalue.type = FcTypeInteger; + fcvalue.u.i = isItalic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN; + FcPatternAdd(pattern, FC_SLANT, fcvalue, FcFalse); + + fcvalue.type = FcTypeBool; + fcvalue.u.b = FcTrue; + FcPatternAdd(pattern, FC_SCALABLE, fcvalue, FcFalse); + + fcvalue.type = FcTypeDouble; + fcvalue.u.d = pixelSize; + FcPatternAdd(pattern, FC_SIZE, fcvalue, FcFalse); + + FcConfigSubstitute(0, pattern, FcMatchPattern); + FcDefaultSubstitute(pattern); + + FcResult result; + // Some versions of fontconfig don't actually write a value into result. + // However, it's not clear from the documentation if result should be a + // non-0 pointer: future versions might expect to be able to write to + // it. So we pass in a valid pointer and ignore it. + FcPattern* match = FcFontMatch(0, pattern, &result); + FcPatternDestroy(pattern); + + out->setDefaults(); + + if (!match) { + FcPatternDestroy(match); + return; + } + + FcBool b; + int i; + + if (FcPatternGetBool(match, FC_ANTIALIAS, 0, &b) == FcResultMatch) + out->useAntiAlias = b; + if (FcPatternGetBool(match, FC_EMBEDDED_BITMAP, 0, &b) == FcResultMatch) + out->useBitmaps = b; + if (FcPatternGetBool(match, FC_AUTOHINT, 0, &b) == FcResultMatch) + out->useAutoHint = b; + if (FcPatternGetBool(match, FC_HINTING, 0, &b) == FcResultMatch) + out->useHinting = b; + if (FcPatternGetInteger(match, FC_HINT_STYLE, 0, &i) == FcResultMatch) + out->hintStyle = i; + if (FcPatternGetInteger(match, FC_RGBA, 0, &i) == FcResultMatch) { + switch (i) { + case FC_RGBA_NONE: + out->useSubpixel = 0; + break; + case FC_RGBA_RGB: + case FC_RGBA_BGR: + case FC_RGBA_VRGB: + case FC_RGBA_VBGR: + out->useSubpixel = 1; + break; + default: + // This includes FC_RGBA_UNKNOWN. + out->useSubpixel = 2; + break; + } + } + + FcPatternDestroy(match); +} + } // namespace WebKit diff --git a/WebKit/chromium/src/gtk/WebInputEventFactory.cpp b/WebKit/chromium/src/gtk/WebInputEventFactory.cpp index 7125a16..71d1b39 100644 --- a/WebKit/chromium/src/gtk/WebInputEventFactory.cpp +++ b/WebKit/chromium/src/gtk/WebInputEventFactory.cpp @@ -45,12 +45,15 @@ namespace { -gint getDoubleClickTime() +bool countsAsDoubleClick(gint timeDiff, gint xDiff, gint yDiff) { static GtkSettings* settings = gtk_settings_get_default(); gint doubleClickTime = 250; - g_object_get(G_OBJECT(settings), "gtk-double-click-time", &doubleClickTime, 0); - return doubleClickTime; + gint doubleClickDistance = 5; + g_object_get(G_OBJECT(settings), + "gtk-double-click-time", &doubleClickTime, + "gtk-double-click-distance", &doubleClickDistance, NULL); + return timeDiff <= doubleClickTime && abs(xDiff) <= doubleClickDistance && abs(yDiff) <= doubleClickDistance; } } // namespace @@ -82,6 +85,10 @@ static int gdkStateToWebEventModifiers(guint state) modifiers |= WebInputEvent::MiddleButtonDown; if (state & GDK_BUTTON3_MASK) modifiers |= WebInputEvent::RightButtonDown; + if (state & GDK_LOCK_MASK) + modifiers |= WebInputEvent::CapsLockOn; + if (state & GDK_MOD2_MASK) + modifiers |= WebInputEvent::NumLockOn; return modifiers; } @@ -151,6 +158,60 @@ static int gdkEventToWindowsKeyCode(const GdkEventKey* event) GDK_period, // 0x3C: GDK_period GDK_slash, // 0x3D: GDK_slash 0, // 0x3E: GDK_Shift_R + 0, // 0x3F: + 0, // 0x40: + 0, // 0x41: + 0, // 0x42: + 0, // 0x43: + 0, // 0x44: + 0, // 0x45: + 0, // 0x46: + 0, // 0x47: + 0, // 0x48: + 0, // 0x49: + 0, // 0x4A: + 0, // 0x4B: + 0, // 0x4C: + 0, // 0x4D: + 0, // 0x4E: + 0, // 0x4F: + 0, // 0x50: + 0, // 0x51: + 0, // 0x52: + 0, // 0x53: + 0, // 0x54: + 0, // 0x55: + 0, // 0x56: + 0, // 0x57: + 0, // 0x58: + 0, // 0x59: + 0, // 0x5A: + 0, // 0x5B: + 0, // 0x5C: + 0, // 0x5D: + 0, // 0x5E: + 0, // 0x5F: + 0, // 0x60: + 0, // 0x61: + 0, // 0x62: + 0, // 0x63: + 0, // 0x64: + 0, // 0x65: + 0, // 0x66: + 0, // 0x67: + 0, // 0x68: + 0, // 0x69: + 0, // 0x6A: + 0, // 0x6B: + 0, // 0x6C: + 0, // 0x6D: + 0, // 0x6E: + 0, // 0x6F: + 0, // 0x70: + 0, // 0x71: + 0, // 0x72: + GDK_Super_L, // 0x73: GDK_Super_L + GDK_Super_R, // 0x74: GDK_Super_R }; // |windowsKeyCode| has to include a valid virtual-key code even when we @@ -350,9 +411,13 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event) static int numClicks = 0; static GdkWindow* eventWindow = 0; static gint lastLeftClickTime = 0; + static gint lastLeftClickX = 0; + static gint lastLeftClickY = 0; - gint time_diff = event->time - lastLeftClickTime; - if (eventWindow == event->window && time_diff < getDoubleClickTime()) + gint timeDiff = event->time - lastLeftClickTime; + gint xDiff = event->x - lastLeftClickX; + gint yDiff = event->y - lastLeftClickY; + if (eventWindow == event->window && countsAsDoubleClick(timeDiff, xDiff, yDiff)) numClicks++; else numClicks = 1; @@ -360,6 +425,8 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event) result.clickCount = numClicks; eventWindow = event->window; lastLeftClickTime = event->time; + lastLeftClickX = event->x; + lastLeftClickY = event->y; } result.button = WebMouseEvent::ButtonNone; diff --git a/WebKit/chromium/src/gtk/WebScreenInfoFactory.cpp b/WebKit/chromium/src/gtk/WebScreenInfoFactory.cpp deleted file mode 100644 index 081daa2..0000000 --- a/WebKit/chromium/src/gtk/WebScreenInfoFactory.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2009 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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 "config.h" -#include "WebScreenInfoFactory.h" - -#include "WebScreenInfo.h" -#include <gtk/gtk.h> - -namespace WebKit { - -WebScreenInfo WebScreenInfoFactory::screenInfo(GtkWidget* widget) -{ - WebScreenInfo results; - results.depth = 32; - results.depthPerComponent = 8; - results.isMonochrome = false; - - if (!widget) - return results; - - GdkScreen* screen = gtk_widget_get_screen(widget); - - results.rect = WebRect( - 0, 0, gdk_screen_get_width(screen), gdk_screen_get_height(screen)); - - // I don't know of a way to query the "maximize" size of the window (e.g. - // screen size less sidebars etc) since this is something which only the - // window manager knows. - results.availableRect = results.rect; - - return results; -} - -} // namespace WebKit diff --git a/WebKit/chromium/src/js/DebuggerAgent.js b/WebKit/chromium/src/js/DebuggerAgent.js deleted file mode 100644 index 301620a..0000000 --- a/WebKit/chromium/src/js/DebuggerAgent.js +++ /dev/null @@ -1,1528 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -/** - * @fileoverview Provides communication interface to remote v8 debugger. See - * protocol decription at http://code.google.com/p/v8/wiki/DebuggerProtocol - */ - -/** - * FIXME: change field naming style to use trailing underscore. - * @constructor - */ -devtools.DebuggerAgent = function() -{ - RemoteDebuggerAgent.debuggerOutput = this.handleDebuggerOutput_.bind(this); - RemoteDebuggerAgent.setContextId = this.setContextId_.bind(this); - - /** - * Id of the inspected page global context. It is used for filtering scripts. - * @type {number} - */ - this.contextId_ = null; - - /** - * Mapping from script id to script info. - * @type {Object} - */ - this.parsedScripts_ = null; - - /** - * Mapping from the request id to the devtools.BreakpointInfo for the - * breakpoints whose v8 ids are not set yet. These breakpoints are waiting for - * "setbreakpoint" responses to learn their ids in the v8 debugger. - * @see #handleSetBreakpointResponse_ - * @type {Object} - */ - this.requestNumberToBreakpointInfo_ = null; - - /** - * Information on current stack frames. - * @type {Array.<devtools.CallFrame>} - */ - this.callFrames_ = []; - - /** - * Whether to stop in the debugger on the exceptions. - * @type {boolean} - */ - this.pauseOnExceptions_ = false; - - /** - * Mapping: request sequence number->callback. - * @type {Object} - */ - this.requestSeqToCallback_ = null; - - /** - * Whether the scripts panel has been shown and initialilzed. - * @type {boolean} - */ - this.scriptsPanelInitialized_ = false; - - /** - * Whether the scripts list should be requested next time when context id is - * set. - * @type {boolean} - */ - this.requestScriptsWhenContextIdSet_ = false; - - /** - * Whether the agent is waiting for initial scripts response. - * @type {boolean} - */ - this.waitingForInitialScriptsResponse_ = false; - - /** - * If backtrace response is received when initial scripts response - * is not yet processed the backtrace handling will be postponed until - * after the scripts response processing. The handler bound to its arguments - * and this agent will be stored in this field then. - * @type {?function()} - */ - this.pendingBacktraceResponseHandler_ = null; - - /** - * Container of all breakpoints set using resource URL. These breakpoints - * survive page reload. Breakpoints set by script id(for scripts that don't - * have URLs) are stored in ScriptInfo objects. - * @type {Object} - */ - this.urlToBreakpoints_ = {}; - - - /** - * Exception message that is shown to user while on exception break. - * @type {WebInspector.ConsoleMessage} - */ - this.currentExceptionMessage_ = null; -}; - - -/** - * A copy of the scope types from v8/src/mirror-delay.js - * @enum {number} - */ -devtools.DebuggerAgent.ScopeType = { - Global: 0, - Local: 1, - With: 2, - Closure: 3, - Catch: 4 -}; - - -/** - * Resets debugger agent to its initial state. - */ -devtools.DebuggerAgent.prototype.reset = function() -{ - this.contextId_ = null; - // No need to request scripts since they all will be pushed in AfterCompile - // events. - this.requestScriptsWhenContextIdSet_ = false; - this.waitingForInitialScriptsResponse_ = false; - - this.parsedScripts_ = {}; - this.requestNumberToBreakpointInfo_ = {}; - this.callFrames_ = []; - this.requestSeqToCallback_ = {}; -}; - - -/** - * Initializes scripts UI. This method is called every time Scripts panel - * is shown. It will send request for context id if it's not set yet. - */ -devtools.DebuggerAgent.prototype.initUI = function() -{ - // Initialize scripts cache when Scripts panel is shown first time. - if (this.scriptsPanelInitialized_) - return; - this.scriptsPanelInitialized_ = true; - if (this.contextId_) { - // We already have context id. This means that we are here from the - // very beginning of the page load cycle and hence will get all scripts - // via after-compile events. No need to request scripts for this session. - // - // There can be a number of scripts from after-compile events that are - // pending addition into the UI. - for (var scriptId in this.parsedScripts_) { - var script = this.parsedScripts_[scriptId]; - WebInspector.parsedScriptSource(scriptId, script.getUrl(), undefined /* script source */, script.getLineOffset()); - } - return; - } - this.waitingForInitialScriptsResponse_ = true; - // Script list should be requested only when current context id is known. - RemoteDebuggerAgent.getContextId(); - this.requestScriptsWhenContextIdSet_ = true; -}; - - -/** - * Asynchronously requests the debugger for the script source. - * @param {number} scriptId Id of the script whose source should be resolved. - * @param {function(source:?string):void} callback Function that will be called - * when the source resolution is completed. "source" parameter will be null - * if the resolution fails. - */ -devtools.DebuggerAgent.prototype.resolveScriptSource = function(scriptId, callback) -{ - var script = this.parsedScripts_[scriptId]; - if (!script || script.isUnresolved()) { - callback(null); - return; - } - - var cmd = new devtools.DebugCommand("scripts", { - "ids": [scriptId], - "includeSource": true - }); - devtools.DebuggerAgent.sendCommand_(cmd); - // Force v8 execution so that it gets to processing the requested command. - RemoteDebuggerAgent.processDebugCommands(); - - this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) { - if (msg.isSuccess()) { - var scriptJson = msg.getBody()[0]; - if (scriptJson) - callback(scriptJson.source); - else - callback(null); - } else - callback(null); - }; -}; - - -/** - * Tells the v8 debugger to stop on as soon as possible. - */ -devtools.DebuggerAgent.prototype.pauseExecution = function() -{ - RemoteDebuggerCommandExecutor.DebuggerPauseScript(); -}; - - -/** - * @param {number} sourceId Id of the script fot the breakpoint. - * @param {number} line Number of the line for the breakpoint. - * @param {?string} condition The breakpoint condition. - */ -devtools.DebuggerAgent.prototype.addBreakpoint = function(sourceId, line, condition) -{ - var script = this.parsedScripts_[sourceId]; - if (!script) - return; - - line = devtools.DebuggerAgent.webkitToV8LineNumber_(line); - - var commandArguments; - if (script.getUrl()) { - var breakpoints = this.urlToBreakpoints_[script.getUrl()]; - if (breakpoints && breakpoints[line]) - return; - if (!breakpoints) { - breakpoints = {}; - this.urlToBreakpoints_[script.getUrl()] = breakpoints; - } - - var breakpointInfo = new devtools.BreakpointInfo(line); - breakpoints[line] = breakpointInfo; - - commandArguments = { - "groupId": this.contextId_, - "type": "script", - "target": script.getUrl(), - "line": line, - "condition": condition - }; - } else { - var breakpointInfo = script.getBreakpointInfo(line); - if (breakpointInfo) - return; - - breakpointInfo = new devtools.BreakpointInfo(line); - script.addBreakpointInfo(breakpointInfo); - - commandArguments = { - "groupId": this.contextId_, - "type": "scriptId", - "target": sourceId, - "line": line, - "condition": condition - }; - } - - var cmd = new devtools.DebugCommand("setbreakpoint", commandArguments); - - this.requestNumberToBreakpointInfo_[cmd.getSequenceNumber()] = breakpointInfo; - - devtools.DebuggerAgent.sendCommand_(cmd); - // Force v8 execution so that it gets to processing the requested command. - // It is necessary for being able to change a breakpoint just after it - // has been created (since we need an existing breakpoint id for that). - RemoteDebuggerAgent.processDebugCommands(); -}; - - -/** - * @param {number} sourceId Id of the script for the breakpoint. - * @param {number} line Number of the line for the breakpoint. - */ -devtools.DebuggerAgent.prototype.removeBreakpoint = function(sourceId, line) -{ - var script = this.parsedScripts_[sourceId]; - if (!script) - return; - - line = devtools.DebuggerAgent.webkitToV8LineNumber_(line); - - var breakpointInfo; - if (script.getUrl()) { - var breakpoints = this.urlToBreakpoints_[script.getUrl()]; - breakpointInfo = breakpoints[line]; - delete breakpoints[line]; - } else { - breakpointInfo = script.getBreakpointInfo(line); - if (breakpointInfo) - script.removeBreakpointInfo(breakpointInfo); - } - - if (!breakpointInfo) - return; - - breakpointInfo.markAsRemoved(); - - var id = breakpointInfo.getV8Id(); - - // If we don't know id of this breakpoint in the v8 debugger we cannot send - // "clearbreakpoint" request. In that case it will be removed in - // "setbreakpoint" response handler when we learn the id. - if (id !== -1) { - this.requestClearBreakpoint_(id); - } -}; - - -/** - * @param {number} sourceId Id of the script for the breakpoint. - * @param {number} line Number of the line for the breakpoint. - * @param {?string} condition New breakpoint condition. - */ -devtools.DebuggerAgent.prototype.updateBreakpoint = function(sourceId, line, condition) -{ - var script = this.parsedScripts_[sourceId]; - if (!script) - return; - - line = devtools.DebuggerAgent.webkitToV8LineNumber_(line); - - var breakpointInfo; - if (script.getUrl()) { - var breakpoints = this.urlToBreakpoints_[script.getUrl()]; - breakpointInfo = breakpoints[line]; - } else - breakpointInfo = script.getBreakpointInfo(line); - - var id = breakpointInfo.getV8Id(); - - // If we don't know id of this breakpoint in the v8 debugger we cannot send - // the "changebreakpoint" request. - if (id !== -1) { - // TODO(apavlov): make use of the real values for "enabled" and - // "ignoreCount" when appropriate. - this.requestChangeBreakpoint_(id, true, condition, null); - } -}; - - -/** - * Tells the v8 debugger to step into the next statement. - */ -devtools.DebuggerAgent.prototype.stepIntoStatement = function() -{ - this.stepCommand_("in"); -}; - - -/** - * Tells the v8 debugger to step out of current function. - */ -devtools.DebuggerAgent.prototype.stepOutOfFunction = function() -{ - this.stepCommand_("out"); -}; - - -/** - * Tells the v8 debugger to step over the next statement. - */ -devtools.DebuggerAgent.prototype.stepOverStatement = function() -{ - this.stepCommand_("next"); -}; - - -/** - * Tells the v8 debugger to continue execution after it has been stopped on a - * breakpoint or an exception. - */ -devtools.DebuggerAgent.prototype.resumeExecution = function() -{ - this.clearExceptionMessage_(); - var cmd = new devtools.DebugCommand("continue"); - devtools.DebuggerAgent.sendCommand_(cmd); -}; - - -/** - * Creates exception message and schedules it for addition to the resource upon - * backtrace availability. - * @param {string} url Resource url. - * @param {number} line Resource line number. - * @param {string} message Exception text. - */ -devtools.DebuggerAgent.prototype.createExceptionMessage_ = function(url, line, message) -{ - this.currentExceptionMessage_ = new WebInspector.ConsoleMessage( - WebInspector.ConsoleMessage.MessageSource.JS, - WebInspector.ConsoleMessage.MessageType.Log, - WebInspector.ConsoleMessage.MessageLevel.Error, - line, - url, - 0 /* group level */, - 1 /* repeat count */, - "[Exception] " + message); -}; - - -/** - * Shows pending exception message that is created with createExceptionMessage_ - * earlier. - */ -devtools.DebuggerAgent.prototype.showPendingExceptionMessage_ = function() -{ - if (!this.currentExceptionMessage_) - return; - var msg = this.currentExceptionMessage_; - var resource = WebInspector.resourceURLMap[msg.url]; - if (resource) { - msg.resource = resource; - WebInspector.panels.resources.addMessageToResource(resource, msg); - } else - this.currentExceptionMessage_ = null; -}; - - -/** - * Clears exception message from the resource. - */ -devtools.DebuggerAgent.prototype.clearExceptionMessage_ = function() -{ - if (this.currentExceptionMessage_) { - var messageElement = this.currentExceptionMessage_._resourceMessageLineElement; - var bubble = messageElement.parentElement; - bubble.removeChild(messageElement); - if (!bubble.firstChild) { - // Last message in bubble removed. - bubble.parentElement.removeChild(bubble); - } - this.currentExceptionMessage_ = null; - } -}; - - -/** - * @return {boolean} True iff the debugger will pause execution on the - * exceptions. - */ -devtools.DebuggerAgent.prototype.pauseOnExceptions = function() -{ - return this.pauseOnExceptions_; -}; - - -/** - * Tells whether to pause in the debugger on the exceptions or not. - * @param {boolean} value True iff execution should be stopped in the debugger - * on the exceptions. - */ -devtools.DebuggerAgent.prototype.setPauseOnExceptions = function(value) -{ - this.pauseOnExceptions_ = value; -}; - - -/** - * Sends "evaluate" request to the debugger. - * @param {Object} arguments Request arguments map. - * @param {function(devtools.DebuggerMessage)} callback Callback to be called - * when response is received. - */ -devtools.DebuggerAgent.prototype.requestEvaluate = function(arguments, callback) -{ - var cmd = new devtools.DebugCommand("evaluate", arguments); - devtools.DebuggerAgent.sendCommand_(cmd); - this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback; -}; - - -/** - * Sends "lookup" request for each unresolved property of the object. When - * response is received the properties will be changed with their resolved - * values. - * @param {Object} object Object whose properties should be resolved. - * @param {function(devtools.DebuggerMessage)} Callback to be called when all - * children are resolved. - * @param {boolean} noIntrinsic Whether intrinsic properties should be included. - */ -devtools.DebuggerAgent.prototype.resolveChildren = function(object, callback, noIntrinsic) -{ - if ("handle" in object) { - var result = []; - devtools.DebuggerAgent.formatObjectProperties_(object, result, noIntrinsic); - callback(result); - } else { - this.requestLookup_([object.ref], function(msg) { - var result = []; - if (msg.isSuccess()) { - var handleToObject = msg.getBody(); - var resolved = handleToObject[object.ref]; - devtools.DebuggerAgent.formatObjectProperties_(resolved, result, noIntrinsic); - callback(result); - } else - callback([]); - }); - } -}; - - -/** - * Sends "scope" request for the scope object to resolve its variables. - * @param {Object} scope Scope to be resolved. - * @param {function(Array.<WebInspector.ObjectPropertyProxy>)} callback - * Callback to be called when all scope variables are resolved. - */ -devtools.DebuggerAgent.prototype.resolveScope = function(scope, callback) -{ - var cmd = new devtools.DebugCommand("scope", { - "frameNumber": scope.frameNumber, - "number": scope.index, - "compactFormat": true - }); - devtools.DebuggerAgent.sendCommand_(cmd); - this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) { - var result = []; - if (msg.isSuccess()) { - var scopeObjectJson = msg.getBody().object; - devtools.DebuggerAgent.formatObjectProperties_(scopeObjectJson, result, true /* no intrinsic */); - } - callback(result); - }; -}; - - -/** - * Sends "scopes" request for the frame object to resolve all variables - * available in the frame. - * @param {number} callFrameId Id of call frame whose variables need to - * be resolved. - * @param {function(Object)} callback Callback to be called when all frame - * variables are resolved. - */ -devtools.DebuggerAgent.prototype.resolveFrameVariables_ = function(callFrameId, callback) -{ - var result = {}; - - var frame = this.callFrames_[callFrameId]; - if (!frame) { - callback(result); - return; - } - - var waitingResponses = 0; - function scopeResponseHandler(msg) { - waitingResponses--; - - if (msg.isSuccess()) { - var properties = msg.getBody().object.properties; - for (var j = 0; j < properties.length; j++) - result[properties[j].name] = true; - } - - // When all scopes are resolved invoke the callback. - if (waitingResponses === 0) - callback(result); - }; - - for (var i = 0; i < frame.scopeChain.length; i++) { - var scope = frame.scopeChain[i].objectId; - if (scope.type === devtools.DebuggerAgent.ScopeType.Global) { - // Do not resolve global scope since it takes for too long. - // TODO(yurys): allow to send only property names in the response. - continue; - } - var cmd = new devtools.DebugCommand("scope", { - "frameNumber": scope.frameNumber, - "number": scope.index, - "compactFormat": true - }); - devtools.DebuggerAgent.sendCommand_(cmd); - this.requestSeqToCallback_[cmd.getSequenceNumber()] = scopeResponseHandler; - waitingResponses++; - } -}; - -/** - * Evaluates the expressionString to an object in the call frame and reports - * all its properties. - * @param{string} expressionString Expression whose properties should be - * collected. - * @param{number} callFrameId The frame id. - * @param{function(Object result,bool isException)} reportCompletions Callback - * function. - */ -devtools.DebuggerAgent.prototype.resolveCompletionsOnFrame = function(expressionString, callFrameId, reportCompletions) -{ - if (expressionString) { - expressionString = "var obj = " + expressionString + - "; var names = {}; for (var n in obj) { names[n] = true; };" + - "names;"; - this.evaluateInCallFrame( - callFrameId, - expressionString, - function(result) { - var names = {}; - if (!result.isException) { - var props = result.value.objectId.properties; - // Put all object properties into the map. - for (var i = 0; i < props.length; i++) - names[props[i].name] = true; - } - reportCompletions(names, result.isException); - }); - } else { - this.resolveFrameVariables_(callFrameId, - function(result) { - reportCompletions(result, false /* isException */); - }); - } -}; - - -/** - * @param{number} scriptId - * @return {string} Type of the context of the script with specified id. - */ -devtools.DebuggerAgent.prototype.getScriptContextType = function(scriptId) -{ - return this.parsedScripts_[scriptId].getContextType(); -}; - - -/** - * Removes specified breakpoint from the v8 debugger. - * @param {number} breakpointId Id of the breakpoint in the v8 debugger. - */ -devtools.DebuggerAgent.prototype.requestClearBreakpoint_ = function(breakpointId) -{ - var cmd = new devtools.DebugCommand("clearbreakpoint", { - "breakpoint": breakpointId - }); - devtools.DebuggerAgent.sendCommand_(cmd); -}; - - -/** - * Changes breakpoint parameters in the v8 debugger. - * @param {number} breakpointId Id of the breakpoint in the v8 debugger. - * @param {boolean} enabled Whether to enable the breakpoint. - * @param {?string} condition New breakpoint condition. - * @param {number} ignoreCount New ignore count for the breakpoint. - */ -devtools.DebuggerAgent.prototype.requestChangeBreakpoint_ = function(breakpointId, enabled, condition, ignoreCount) -{ - var cmd = new devtools.DebugCommand("changebreakpoint", { - "breakpoint": breakpointId, - "enabled": enabled, - "condition": condition, - "ignoreCount": ignoreCount - }); - devtools.DebuggerAgent.sendCommand_(cmd); -}; - - -/** - * Sends "backtrace" request to v8. - */ -devtools.DebuggerAgent.prototype.requestBacktrace_ = function() -{ - var cmd = new devtools.DebugCommand("backtrace", { - "compactFormat":true - }); - devtools.DebuggerAgent.sendCommand_(cmd); -}; - - -/** - * Sends command to v8 debugger. - * @param {devtools.DebugCommand} cmd Command to execute. - */ -devtools.DebuggerAgent.sendCommand_ = function(cmd) -{ - RemoteDebuggerCommandExecutor.DebuggerCommand(cmd.toJSONProtocol()); -}; - - -/** - * Tells the v8 debugger to make the next execution step. - * @param {string} action "in", "out" or "next" action. - */ -devtools.DebuggerAgent.prototype.stepCommand_ = function(action) -{ - this.clearExceptionMessage_(); - var cmd = new devtools.DebugCommand("continue", { - "stepaction": action, - "stepcount": 1 - }); - devtools.DebuggerAgent.sendCommand_(cmd); -}; - - -/** - * Sends "lookup" request to v8. - * @param {number} handle Handle to the object to lookup. - */ -devtools.DebuggerAgent.prototype.requestLookup_ = function(handles, callback) -{ - var cmd = new devtools.DebugCommand("lookup", { - "compactFormat":true, - "handles": handles - }); - devtools.DebuggerAgent.sendCommand_(cmd); - this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback; -}; - - -/** - * Sets debugger context id for scripts filtering. - * @param {number} contextId Id of the inspected page global context. - */ -devtools.DebuggerAgent.prototype.setContextId_ = function(contextId) -{ - this.contextId_ = contextId; - - // If it's the first time context id is set request scripts list. - if (this.requestScriptsWhenContextIdSet_) { - this.requestScriptsWhenContextIdSet_ = false; - var cmd = new devtools.DebugCommand("scripts", { - "includeSource": false - }); - devtools.DebuggerAgent.sendCommand_(cmd); - // Force v8 execution so that it gets to processing the requested command. - RemoteDebuggerAgent.processDebugCommands(); - - var debuggerAgent = this; - this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) { - // Handle the response iff the context id hasn't changed since the request - // was issued. Otherwise if the context id did change all up-to-date - // scripts will be pushed in after compile events and there is no need to - // handle the response. - if (contextId === debuggerAgent.contextId_) - debuggerAgent.handleScriptsResponse_(msg); - - // We received initial scripts response so flush the flag and - // see if there is an unhandled backtrace response. - debuggerAgent.waitingForInitialScriptsResponse_ = false; - if (debuggerAgent.pendingBacktraceResponseHandler_) { - debuggerAgent.pendingBacktraceResponseHandler_(); - debuggerAgent.pendingBacktraceResponseHandler_ = null; - } - }; - } -}; - - -/** - * Handles output sent by v8 debugger. The output is either asynchronous event - * or response to a previously sent request. See protocol definitioun for more - * details on the output format. - * @param {string} output - */ -devtools.DebuggerAgent.prototype.handleDebuggerOutput_ = function(output) -{ - var msg; - try { - msg = new devtools.DebuggerMessage(output); - } catch(e) { - debugPrint("Failed to handle debugger response:\n" + e); - throw e; - } - - if (msg.getType() === "event") { - if (msg.getEvent() === "break") - this.handleBreakEvent_(msg); - else if (msg.getEvent() === "exception") - this.handleExceptionEvent_(msg); - else if (msg.getEvent() === "afterCompile") - this.handleAfterCompileEvent_(msg); - } else if (msg.getType() === "response") { - if (msg.getCommand() === "scripts") - this.invokeCallbackForResponse_(msg); - else if (msg.getCommand() === "setbreakpoint") - this.handleSetBreakpointResponse_(msg); - else if (msg.getCommand() === "clearbreakpoint") - this.handleClearBreakpointResponse_(msg); - else if (msg.getCommand() === "backtrace") - this.handleBacktraceResponse_(msg); - else if (msg.getCommand() === "lookup") - this.invokeCallbackForResponse_(msg); - else if (msg.getCommand() === "evaluate") - this.invokeCallbackForResponse_(msg); - else if (msg.getCommand() === "scope") - this.invokeCallbackForResponse_(msg); - } -}; - - -/** - * @param {devtools.DebuggerMessage} msg - */ -devtools.DebuggerAgent.prototype.handleBreakEvent_ = function(msg) -{ - // Force scrips panel to be shown first. - WebInspector.currentPanel = WebInspector.panels.scripts; - - var body = msg.getBody(); - - var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine); - this.requestBacktrace_(); -}; - - -/** - * @param {devtools.DebuggerMessage} msg - */ -devtools.DebuggerAgent.prototype.handleExceptionEvent_ = function(msg) -{ - // Force scrips panel to be shown first. - WebInspector.currentPanel = WebInspector.panels.scripts; - - var body = msg.getBody(); - // No script field in the body means that v8 failed to parse the script. We - // resume execution on parser errors automatically. - if (this.pauseOnExceptions_ && body.script) { - var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine); - this.createExceptionMessage_(body.script.name, line, body.exception.text); - this.requestBacktrace_(); - } else - this.resumeExecution(); -}; - - -/** - * @param {devtools.DebuggerMessage} msg - */ -devtools.DebuggerAgent.prototype.handleScriptsResponse_ = function(msg) -{ - var scripts = msg.getBody(); - for (var i = 0; i < scripts.length; i++) { - var script = scripts[i]; - - // Skip scripts from other tabs. - if (!this.isScriptFromInspectedContext_(script, msg)) - continue; - - // We may already have received the info in an afterCompile event. - if (script.id in this.parsedScripts_) - continue; - this.addScriptInfo_(script, msg); - } -}; - - -/** - * @param {Object} script Json object representing script. - * @param {devtools.DebuggerMessage} msg Debugger response. - */ -devtools.DebuggerAgent.prototype.isScriptFromInspectedContext_ = function(script, msg) -{ - if (!script.context) { - // Always ignore scripts from the utility context. - return false; - } - var context = msg.lookup(script.context.ref); - var scriptContextId = context.data; - if (typeof scriptContextId === "undefined") - return false; // Always ignore scripts from the utility context. - if (this.contextId_ === null) - return true; - // Find the id from context data. The context data has the format "type,id". - var comma = context.data.indexOf(","); - if (comma < 0) - return false; - return (context.data.substring(comma + 1) == this.contextId_); -}; - - -/** - * @param {devtools.DebuggerMessage} msg - */ -devtools.DebuggerAgent.prototype.handleSetBreakpointResponse_ = function(msg) -{ - var requestSeq = msg.getRequestSeq(); - var breakpointInfo = this.requestNumberToBreakpointInfo_[requestSeq]; - if (!breakpointInfo) { - // TODO(yurys): handle this case - return; - } - delete this.requestNumberToBreakpointInfo_[requestSeq]; - if (!msg.isSuccess()) { - // TODO(yurys): handle this case - return; - } - var idInV8 = msg.getBody().breakpoint; - breakpointInfo.setV8Id(idInV8); - - if (breakpointInfo.isRemoved()) - this.requestClearBreakpoint_(idInV8); -}; - - -/** - * @param {devtools.DebuggerMessage} msg - */ -devtools.DebuggerAgent.prototype.handleAfterCompileEvent_ = function(msg) -{ - if (!this.contextId_) { - // Ignore scripts delta if main request has not been issued yet. - return; - } - var script = msg.getBody().script; - - // Ignore scripts from other tabs. - if (!this.isScriptFromInspectedContext_(script, msg)) - return; - this.addScriptInfo_(script, msg); -}; - - -/** - * Adds the script info to the local cache. This method assumes that the script - * is not in the cache yet. - * @param {Object} script Script json object from the debugger message. - * @param {devtools.DebuggerMessage} msg Debugger message containing the script - * data. - */ -devtools.DebuggerAgent.prototype.addScriptInfo_ = function(script, msg) -{ - var context = msg.lookup(script.context.ref); - var contextType; - // Find the type from context data. The context data has the format - // "type,id". - var comma = context.data.indexOf(","); - if (comma < 0) - return - contextType = context.data.substring(0, comma); - this.parsedScripts_[script.id] = new devtools.ScriptInfo(script.id, script.name, script.lineOffset, contextType); - if (this.scriptsPanelInitialized_) { - // Only report script as parsed after scripts panel has been shown. - WebInspector.parsedScriptSource(script.id, script.name, script.source, script.lineOffset); - } -}; - - -/** - * @param {devtools.DebuggerMessage} msg - */ -devtools.DebuggerAgent.prototype.handleClearBreakpointResponse_ = function(msg) -{ - // Do nothing. -}; - - -/** - * Handles response to "backtrace" command. - * @param {devtools.DebuggerMessage} msg - */ -devtools.DebuggerAgent.prototype.handleBacktraceResponse_ = function(msg) -{ - if (this.waitingForInitialScriptsResponse_) - this.pendingBacktraceResponseHandler_ = this.doHandleBacktraceResponse_.bind(this, msg); - else - this.doHandleBacktraceResponse_(msg); -}; - - -/** - * @param {devtools.DebuggerMessage} msg - */ -devtools.DebuggerAgent.prototype.doHandleBacktraceResponse_ = function(msg) -{ - var frames = msg.getBody().frames; - this.callFrames_ = []; - for (var i = 0; i < frames.length; ++i) - this.callFrames_.push(this.formatCallFrame_(frames[i])); - WebInspector.pausedScript(this.callFrames_); - this.showPendingExceptionMessage_(); - InspectorFrontendHost.activateWindow(); -}; - - -/** - * Evaluates code on given callframe. - */ -devtools.DebuggerAgent.prototype.evaluateInCallFrame = function(callFrameId, code, callback) -{ - var callFrame = this.callFrames_[callFrameId]; - callFrame.evaluate_(code, callback); -}; - - -/** - * Handles response to a command by invoking its callback (if any). - * @param {devtools.DebuggerMessage} msg - * @return {boolean} Whether a callback for the given message was found and - * excuted. - */ -devtools.DebuggerAgent.prototype.invokeCallbackForResponse_ = function(msg) -{ - var callback = this.requestSeqToCallback_[msg.getRequestSeq()]; - if (!callback) { - // It may happend if reset was called. - return false; - } - delete this.requestSeqToCallback_[msg.getRequestSeq()]; - callback(msg); - return true; -}; - - -/** - * @param {Object} stackFrame Frame json object from "backtrace" response. - * @return {!devtools.CallFrame} Object containing information related to the - * call frame in the format expected by ScriptsPanel and its panes. - */ -devtools.DebuggerAgent.prototype.formatCallFrame_ = function(stackFrame) -{ - var func = stackFrame.func; - var sourceId = func.scriptId; - - // Add service script if it does not exist. - var existingScript = this.parsedScripts_[sourceId]; - if (!existingScript) { - this.parsedScripts_[sourceId] = new devtools.ScriptInfo(sourceId, null /* name */, 0 /* line */, "unknown" /* type */, true /* unresolved */); - WebInspector.parsedScriptSource(sourceId, null, null, 0); - } - - var funcName = func.name || func.inferredName || "(anonymous function)"; - var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(stackFrame.line); - - // Add basic scope chain info with scope variables. - var scopeChain = []; - var ScopeType = devtools.DebuggerAgent.ScopeType; - for (var i = 0; i < stackFrame.scopes.length; i++) { - var scope = stackFrame.scopes[i]; - scope.frameNumber = stackFrame.index; - var scopeObjectProxy = new WebInspector.ObjectProxy(0, scope, [], 0, "", true); - scopeObjectProxy.isScope = true; - switch(scope.type) { - case ScopeType.Global: - scopeObjectProxy.isDocument = true; - break; - case ScopeType.Local: - scopeObjectProxy.isLocal = true; - scopeObjectProxy.thisObject = devtools.DebuggerAgent.formatObjectProxy_(stackFrame.receiver); - break; - case ScopeType.With: - // Catch scope is treated as a regular with scope by WebKit so we - // also treat it this way. - case ScopeType.Catch: - scopeObjectProxy.isWithBlock = true; - break; - case ScopeType.Closure: - scopeObjectProxy.isClosure = true; - break; - } - scopeChain.push(scopeObjectProxy); - } - return new devtools.CallFrame(stackFrame.index, "function", funcName, sourceId, line, scopeChain); -}; - - -/** - * Collects properties for an object from the debugger response. - * @param {Object} object An object from the debugger protocol response. - * @param {Array.<WebInspector.ObjectPropertyProxy>} result An array to put the - * properties into. - * @param {boolean} noIntrinsic Whether intrinsic properties should be - * included. - */ -devtools.DebuggerAgent.formatObjectProperties_ = function(object, result, noIntrinsic) -{ - devtools.DebuggerAgent.propertiesToProxies_(object.properties, result); - if (noIntrinsic) - return; - - result.push(new WebInspector.ObjectPropertyProxy("__proto__", devtools.DebuggerAgent.formatObjectProxy_(object.protoObject))); - result.push(new WebInspector.ObjectPropertyProxy("constructor", devtools.DebuggerAgent.formatObjectProxy_(object.constructorFunction))); - // Don't add 'prototype' property since it is one of the regualar properties. -}; - - -/** - * For each property in "properties" creates its proxy representative. - * @param {Array.<Object>} properties Receiver properties or locals array from - * "backtrace" response. - * @param {Array.<WebInspector.ObjectPropertyProxy>} Results holder. - */ -devtools.DebuggerAgent.propertiesToProxies_ = function(properties, result) -{ - var map = {}; - for (var i = 0; i < properties.length; ++i) { - var property = properties[i]; - var name = String(property.name); - if (name in map) - continue; - map[name] = true; - var value = devtools.DebuggerAgent.formatObjectProxy_(property.value); - var propertyProxy = new WebInspector.ObjectPropertyProxy(name, value); - result.push(propertyProxy); - } -}; - - -/** - * @param {Object} v An object reference from the debugger response. - * @return {*} The value representation expected by ScriptsPanel. - */ -devtools.DebuggerAgent.formatObjectProxy_ = function(v) -{ - var description; - var hasChildren = false; - if (v.type === "object") { - description = v.className; - hasChildren = true; - } else if (v.type === "function") { - if (v.source) - description = v.source; - else - description = "function " + v.name + "()"; - hasChildren = true; - } else if (v.type === "undefined") - description = "undefined"; - else if (v.type === "null") - description = "null"; - else if (typeof v.value !== "undefined") { - // Check for undefined and null types before checking the value, otherwise - // null/undefined may have blank value. - description = v.value; - } else - description = "<unresolved ref: " + v.ref + ", type: " + v.type + ">"; - - var proxy = new WebInspector.ObjectProxy(0, v, [], 0, description, hasChildren); - proxy.type = v.type; - proxy.isV8Ref = true; - return proxy; -}; - - -/** - * Converts line number from Web Inspector UI(1-based) to v8(0-based). - * @param {number} line Resource line number in Web Inspector UI. - * @return {number} The line number in v8. - */ -devtools.DebuggerAgent.webkitToV8LineNumber_ = function(line) -{ - return line - 1; -}; - - -/** - * Converts line number from v8(0-based) to Web Inspector UI(1-based). - * @param {number} line Resource line number in v8. - * @return {number} The line number in Web Inspector. - */ -devtools.DebuggerAgent.v8ToWwebkitLineNumber_ = function(line) -{ - return line + 1; -}; - - -/** - * @param {number} scriptId Id of the script. - * @param {?string} url Script resource URL if any. - * @param {number} lineOffset First line 0-based offset in the containing - * document. - * @param {string} contextType Type of the script's context: - * "page" - regular script from html page - * "injected" - extension content script - * @param {bool} opt_isUnresolved If true, script will not be resolved. - * @constructor - */ -devtools.ScriptInfo = function(scriptId, url, lineOffset, contextType, opt_isUnresolved) -{ - this.scriptId_ = scriptId; - this.lineOffset_ = lineOffset; - this.contextType_ = contextType; - this.url_ = url; - this.isUnresolved_ = opt_isUnresolved; - - this.lineToBreakpointInfo_ = {}; -}; - - -/** - * @return {number} - */ -devtools.ScriptInfo.prototype.getLineOffset = function() -{ - return this.lineOffset_; -}; - - -/** - * @return {string} - */ -devtools.ScriptInfo.prototype.getContextType = function() -{ - return this.contextType_; -}; - - -/** - * @return {?string} - */ -devtools.ScriptInfo.prototype.getUrl = function() -{ - return this.url_; -}; - - -/** - * @return {?bool} - */ -devtools.ScriptInfo.prototype.isUnresolved = function() -{ - return this.isUnresolved_; -}; - - -/** - * @param {number} line 0-based line number in the script. - * @return {?devtools.BreakpointInfo} Information on a breakpoint at the - * specified line in the script or undefined if there is no breakpoint at - * that line. - */ -devtools.ScriptInfo.prototype.getBreakpointInfo = function(line) -{ - return this.lineToBreakpointInfo_[line]; -}; - - -/** - * Adds breakpoint info to the script. - * @param {devtools.BreakpointInfo} breakpoint - */ -devtools.ScriptInfo.prototype.addBreakpointInfo = function(breakpoint) -{ - this.lineToBreakpointInfo_[breakpoint.getLine()] = breakpoint; -}; - - -/** - * @param {devtools.BreakpointInfo} breakpoint Breakpoint info to be removed. - */ -devtools.ScriptInfo.prototype.removeBreakpointInfo = function(breakpoint) -{ - var line = breakpoint.getLine(); - delete this.lineToBreakpointInfo_[line]; -}; - - - -/** - * @param {number} line Breakpoint 0-based line number in the containing script. - * @constructor - */ -devtools.BreakpointInfo = function(line) -{ - this.line_ = line; - this.v8id_ = -1; - this.removed_ = false; -}; - - -/** - * @return {number} - */ -devtools.BreakpointInfo.prototype.getLine = function(n) -{ - return this.line_; -}; - - -/** - * @return {number} Unique identifier of this breakpoint in the v8 debugger. - */ -devtools.BreakpointInfo.prototype.getV8Id = function(n) -{ - return this.v8id_; -}; - - -/** - * Sets id of this breakpoint in the v8 debugger. - * @param {number} id - */ -devtools.BreakpointInfo.prototype.setV8Id = function(id) -{ - this.v8id_ = id; -}; - - -/** - * Marks this breakpoint as removed from the front-end. - */ -devtools.BreakpointInfo.prototype.markAsRemoved = function() -{ - this.removed_ = true; -}; - - -/** - * @return {boolean} Whether this breakpoint has been removed from the - * front-end. - */ -devtools.BreakpointInfo.prototype.isRemoved = function() -{ - return this.removed_; -}; - - -/** - * Call stack frame data. - * @param {string} id CallFrame id. - * @param {string} type CallFrame type. - * @param {string} functionName CallFrame type. - * @param {string} sourceID Source id. - * @param {number} line Source line. - * @param {Array.<Object>} scopeChain Array of scoped objects. - * @construnctor - */ -devtools.CallFrame = function(id, type, functionName, sourceID, line, scopeChain) -{ - this.id = id; - this.type = type; - this.functionName = functionName; - this.sourceID = sourceID; - this.line = line; - this.scopeChain = scopeChain; -}; - - -/** - * This method issues asynchronous evaluate request, reports result to the - * callback. - * @param {string} expression An expression to be evaluated in the context of - * this call frame. - * @param {function(Object):undefined} callback Callback to report result to. - */ -devtools.CallFrame.prototype.evaluate_ = function(expression, callback) -{ - devtools.tools.getDebuggerAgent().requestEvaluate({ - "expression": expression, - "frame": this.id, - "global": false, - "disable_break": false, - "compactFormat": true - }, - function(response) { - var result = {}; - if (response.isSuccess()) - result.value = devtools.DebuggerAgent.formatObjectProxy_(response.getBody()); - else { - result.value = response.getMessage(); - result.isException = true; - } - callback(result); - }); -}; - - -/** - * JSON based commands sent to v8 debugger. - * @param {string} command Name of the command to execute. - * @param {Object} opt_arguments Command-specific arguments map. - * @constructor - */ -devtools.DebugCommand = function(command, opt_arguments) -{ - this.command_ = command; - this.type_ = "request"; - this.seq_ = ++devtools.DebugCommand.nextSeq_; - if (opt_arguments) - this.arguments_ = opt_arguments; -}; - - -/** - * Next unique number to be used as debugger request sequence number. - * @type {number} - */ -devtools.DebugCommand.nextSeq_ = 1; - - -/** - * @return {number} - */ -devtools.DebugCommand.prototype.getSequenceNumber = function() -{ - return this.seq_; -}; - - -/** - * @return {string} - */ -devtools.DebugCommand.prototype.toJSONProtocol = function() -{ - var json = { - "seq": this.seq_, - "type": this.type_, - "command": this.command_ - } - if (this.arguments_) - json.arguments = this.arguments_; - return JSON.stringify(json); -}; - - -/** - * JSON messages sent from v8 debugger. See protocol definition for more - * details: http://code.google.com/p/v8/wiki/DebuggerProtocol - * @param {string} msg Raw protocol packet as JSON string. - * @constructor - */ -devtools.DebuggerMessage = function(msg) -{ - this.packet_ = JSON.parse(msg); - this.refs_ = []; - if (this.packet_.refs) { - for (var i = 0; i < this.packet_.refs.length; i++) - this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i]; - } -}; - - -/** - * @return {string} The packet type. - */ -devtools.DebuggerMessage.prototype.getType = function() -{ - return this.packet_.type; -}; - - -/** - * @return {?string} The packet event if the message is an event. - */ -devtools.DebuggerMessage.prototype.getEvent = function() -{ - return this.packet_.event; -}; - - -/** - * @return {?string} The packet command if the message is a response to a - * command. - */ -devtools.DebuggerMessage.prototype.getCommand = function() -{ - return this.packet_.command; -}; - - -/** - * @return {number} The packet request sequence. - */ -devtools.DebuggerMessage.prototype.getRequestSeq = function() -{ - return this.packet_.request_seq; -}; - - -/** - * @return {number} Whether the v8 is running after processing the request. - */ -devtools.DebuggerMessage.prototype.isRunning = function() -{ - return this.packet_.running ? true : false; -}; - - -/** - * @return {boolean} Whether the request succeeded. - */ -devtools.DebuggerMessage.prototype.isSuccess = function() -{ - return this.packet_.success ? true : false; -}; - - -/** - * @return {string} - */ -devtools.DebuggerMessage.prototype.getMessage = function() -{ - return this.packet_.message; -}; - - -/** - * @return {Object} Parsed message body json. - */ -devtools.DebuggerMessage.prototype.getBody = function() -{ - return this.packet_.body; -}; - - -/** - * @param {number} handle Object handle. - * @return {?Object} Returns the object with the handle if it was sent in this - * message(some objects referenced by handles may be missing in the message). - */ -devtools.DebuggerMessage.prototype.lookup = function(handle) -{ - return this.refs_[handle]; -}; diff --git a/WebKit/chromium/src/js/DevTools.js b/WebKit/chromium/src/js/DevTools.js index dcb181b..11ebc1f 100644 --- a/WebKit/chromium/src/js/DevTools.js +++ b/WebKit/chromium/src/js/DevTools.js @@ -35,286 +35,38 @@ * WebInspector functionality while it is getting upstreamed into WebCore. */ -/** - * Dispatches raw message from the host. - * @param {string} remoteName - * @prama {string} methodName - * @param {string} param1, param2, param3 Arguments to dispatch. - */ -devtools$$dispatch = function(remoteName, methodName, param1, param2, param3) -{ - remoteName = "Remote" + remoteName.substring(0, remoteName.length - 8); - var agent = window[remoteName]; - if (!agent) { - debugPrint("No remote agent '" + remoteName + "' found."); - return; - } - var method = agent[methodName]; - if (!method) { - debugPrint("No method '" + remoteName + "." + methodName + "' found."); - return; - } - method.call(this, param1, param2, param3); -}; - - -devtools.ToolsAgent = function() -{ - RemoteToolsAgent.didDispatchOn = WebInspector.Callback.processCallback; - RemoteToolsAgent.frameNavigate = this.frameNavigate_.bind(this); - RemoteToolsAgent.dispatchOnClient = this.dispatchOnClient_.bind(this); - this.debuggerAgent_ = new devtools.DebuggerAgent(); - this.profilerAgent_ = new devtools.ProfilerAgent(); -}; - - -/** - * Resets tools agent to its initial state. - */ -devtools.ToolsAgent.prototype.reset = function() -{ - this.debuggerAgent_.reset(); -}; - - -/** - * @param {string} script Script exression to be evaluated in the context of the - * inspected page. - * @param {function(Object|string, boolean):undefined} opt_callback Function to - * call with the result. - */ -devtools.ToolsAgent.prototype.evaluateJavaScript = function(script, opt_callback) -{ - InspectorBackend.evaluate(script, opt_callback || function() {}); -}; - - -/** - * @return {devtools.DebuggerAgent} Debugger agent instance. - */ -devtools.ToolsAgent.prototype.getDebuggerAgent = function() -{ - return this.debuggerAgent_; -}; - - -/** - * @return {devtools.ProfilerAgent} Profiler agent instance. - */ -devtools.ToolsAgent.prototype.getProfilerAgent = function() -{ - return this.profilerAgent_; -}; - - -/** - * @param {string} url Url frame navigated to. - * @see tools_agent.h - * @private - */ -devtools.ToolsAgent.prototype.frameNavigate_ = function(url) -{ - this.reset(); - // Do not reset Profiles panel. - var profiles = null; - if ("profiles" in WebInspector.panels) { - profiles = WebInspector.panels["profiles"]; - delete WebInspector.panels["profiles"]; - } - WebInspector.reset(); - if (profiles !== null) - WebInspector.panels["profiles"] = profiles; -}; - - -/** - * @param {string} message Serialized call to be dispatched on WebInspector. - * @private - */ -devtools.ToolsAgent.prototype.dispatchOnClient_ = function(message) -{ - var args = JSON.parse(message); - var methodName = args[0]; - var parameters = args.slice(1); - WebInspector[methodName].apply(WebInspector, parameters); -}; - - -/** - * Evaluates js expression. - * @param {string} expr - */ -devtools.ToolsAgent.prototype.evaluate = function(expr) -{ - RemoteToolsAgent.evaluate(expr); -}; - - -/** - * Enables / disables resources panel in the ui. - * @param {boolean} enabled New panel status. - */ -WebInspector.setResourcesPanelEnabled = function(enabled) -{ - InspectorBackend._resourceTrackingEnabled = enabled; - WebInspector.panels.resources.reset(); -}; - - -/** - * Prints string to the inspector console or shows alert if the console doesn't - * exist. - * @param {string} text - */ -function debugPrint(text) { - var console = WebInspector.console; - if (console) { - console.addMessage(new WebInspector.ConsoleMessage( - WebInspector.ConsoleMessage.MessageSource.JS, - WebInspector.ConsoleMessage.MessageType.Log, - WebInspector.ConsoleMessage.MessageLevel.Log, - 1, "chrome://devtools/<internal>", undefined, -1, text)); - } else - alert(text); -} - - -/** - * Global instance of the tools agent. - * @type {devtools.ToolsAgent} - */ -devtools.tools = null; - - var context = {}; // Used by WebCore's inspector routines. -/////////////////////////////////////////////////////////////////////////////// -// Here and below are overrides to existing WebInspector methods only. -// TODO(pfeldman): Patch WebCore and upstream changes. -var oldLoaded = WebInspector.loaded; -WebInspector.loaded = function() -{ - devtools.tools = new devtools.ToolsAgent(); - devtools.tools.reset(); - +(function () { Preferences.ignoreWhitespace = false; Preferences.samplingCPUProfiler = true; Preferences.heapProfilerPresent = true; - oldLoaded.call(this); - - InspectorFrontendHost.loaded(); -}; - - -(function() -{ - - /** - * Handles an F3 keydown event to focus the Inspector search box. - * @param {KeyboardEvent} event Event to optionally handle - * @return {boolean} whether the event has been handled - */ - function handleF3Keydown(event) { - if (event.keyIdentifier === "F3" && !event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) { - var searchField = document.getElementById("search"); - searchField.focus(); - searchField.select(); - event.preventDefault(); - return true; - } - return false; - } - - - var oldKeyDown = WebInspector.documentKeyDown; - /** - * This override allows to intercept keydown events we want to handle in a - * custom way. Some nested documents (iframes) delegate keydown handling to - * WebInspector.documentKeyDown (e.g. SourceFrame). - * @param {KeyboardEvent} event - * @override - */ - WebInspector.documentKeyDown = function(event) { - var isHandled = handleF3Keydown(event); - if (!isHandled) { - // Mute refresh action. - if (event.keyIdentifier === "F5") - event.preventDefault(); - else if (event.keyIdentifier === "U+0052" /* "R" */ && (event.ctrlKey || event.metaKey)) - event.preventDefault(); - else - oldKeyDown.call(this, event); - } - }; + Preferences.debuggerAlwaysEnabled = true; + Preferences.profilerAlwaysEnabled = true; + Preferences.canEditScriptSource = true; + Preferences.onlineDetectionEnabled = false; + Preferences.nativeInstrumentationEnabled = true; + Preferences.fileSystemEnabled = false; + Preferences.showTimingTab = true; })(); +var devtools = devtools || {}; -/** - * This override is necessary for adding script source asynchronously. - * @override - */ -WebInspector.ScriptView.prototype.setupSourceFrameIfNeeded = function() +devtools.domContentLoaded = function() { - if (!this._frameNeedsSetup) - return; - - this.attach(); - - if (this.script.source) - this.didResolveScriptSource_(); - else { - var self = this; - devtools.tools.getDebuggerAgent().resolveScriptSource( - this.script.sourceID, - function(source) { - self.script.source = source || WebInspector.UIString("<source is not available>"); - self.didResolveScriptSource_(); - }); - } -}; - - -/** - * Performs source frame setup when script source is aready resolved. - */ -WebInspector.ScriptView.prototype.didResolveScriptSource_ = function() -{ - this.sourceFrame.setContent("text/javascript", this.script.source); - this._sourceFrameSetup = true; - delete this._frameNeedsSetup; -}; - - -/** - * @param {string} type Type of the the property value("object" or "function"). - * @param {string} className Class name of the property value. - * @constructor - */ -WebInspector.UnresolvedPropertyValue = function(type, className) -{ - this.type = type; - this.className = className; -}; - - -(function() -{ - var oldShow = WebInspector.ScriptsPanel.prototype.show; - WebInspector.ScriptsPanel.prototype.show = function() - { - devtools.tools.getDebuggerAgent().initUI(); - this.enableToggleButton.visible = false; - oldShow.call(this); - }; -})(); + WebInspector.setAttachedWindow(WebInspector.queryParamsObject.docked === "true"); + if (WebInspector.queryParamsObject.toolbar_color && WebInspector.queryParamsObject.text_color) + WebInspector.setToolbarColors(WebInspector.queryParamsObject.toolbar_color, WebInspector.queryParamsObject.text_color); +} +document.addEventListener("DOMContentLoaded", devtools.domContentLoaded, false); +// FIXME: This needs to be upstreamed. (function InterceptProfilesPanelEvents() { var oldShow = WebInspector.ProfilesPanel.prototype.show; WebInspector.ProfilesPanel.prototype.show = function() { - devtools.tools.getProfilerAgent().initializeProfiling(); this.enableToggleButton.visible = false; oldShow.call(this); // Show is called on every show event of a panel, so @@ -334,36 +86,6 @@ WebInspector.UIString = function(string) }; -// There is no clear way of setting frame title yet. So sniffing main resource -// load. -(function OverrideUpdateResource() { - var originalUpdateResource = WebInspector.updateResource; - WebInspector.updateResource = function(identifier, payload) - { - originalUpdateResource.call(this, identifier, payload); - var resource = this.resources[identifier]; - if (resource && resource.mainResource && resource.finished) - document.title = WebInspector.UIString("Developer Tools - %s", resource.url); - }; -})(); - - -// Highlight extension content scripts in the scripts list. -(function () { - var original = WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu; - WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu = function(script) - { - var result = original.apply(this, arguments); - var debuggerAgent = devtools.tools.getDebuggerAgent(); - var type = debuggerAgent.getScriptContextType(script.sourceID); - var option = script.filesSelectOption; - if (type === "injected" && option) - option.addStyleClass("injected"); - return result; - }; -})(); - - /** Pending WebKit upstream by apavlov). Fixes iframe vs drag problem. */ (function() { @@ -392,113 +114,75 @@ WebInspector.UIString = function(string) })(); -(function () { -var orig = InjectedScriptAccess.prototype.getProperties; -InjectedScriptAccess.prototype.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate, callback) -{ - if (objectProxy.isScope) - devtools.tools.getDebuggerAgent().resolveScope(objectProxy.objectId, callback); - else if (objectProxy.isV8Ref) - devtools.tools.getDebuggerAgent().resolveChildren(objectProxy.objectId, callback, false); - else - orig.apply(this, arguments); -}; -})(); +/////////////////////////////////////////// +// Chromium layout test harness support. // +/////////////////////////////////////////// -(function() -{ -InjectedScriptAccess.prototype.evaluateInCallFrame = function(callFrameId, code, objectGroup, callback) -{ - //TODO(pfeldman): remove once 49084 is rolled. - if (!callback) - callback = objectGroup; - devtools.tools.getDebuggerAgent().evaluateInCallFrame(callFrameId, code, callback); -}; -})(); - +WebInspector.runAfterPendingDispatchesQueue = []; -WebInspector.resourceTrackingWasEnabled = function() +WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback) { - InspectorBackend._resourceTrackingEnabled = true; - this.panels.resources.resourceTrackingWasEnabled(); + WebInspector.runAfterPendingDispatchesQueue.push(callback); }; -WebInspector.resourceTrackingWasDisabled = function() +WebInspector.queuesAreEmpty = function() { - InspectorBackend._resourceTrackingEnabled = false; - this.panels.resources.resourceTrackingWasDisabled(); + var copy = this.runAfterPendingDispatchesQueue.slice(); + this.runAfterPendingDispatchesQueue = []; + for (var i = 0; i < copy.length; ++i) + copy[i].call(this); }; -(function() -{ -var orig = WebInspector.ConsoleMessage.prototype.setMessageBody; -WebInspector.ConsoleMessage.prototype.setMessageBody = function(args) -{ - for (var i = 0; i < args.length; ++i) { - if (typeof args[i] === "string") - args[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(args[i]); - } - orig.call(this, args); -}; -})(); +///////////////////////////// +// Chromium theme support. // +///////////////////////////// -(function() +WebInspector.setToolbarColors = function(backgroundColor, color) { -var orig = InjectedScriptAccess.prototype.getCompletions; -InjectedScriptAccess.prototype.getCompletions = function(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions) -{ - if (typeof callFrameId === "number") - devtools.tools.getDebuggerAgent().resolveCompletionsOnFrame(expressionString, callFrameId, reportCompletions); - else - return orig.apply(this, arguments); -}; -})(); - + if (!WebInspector._themeStyleElement) { + WebInspector._themeStyleElement = document.createElement("style"); + document.head.appendChild(WebInspector._themeStyleElement); + } + WebInspector._themeStyleElement.textContent = + "#toolbar {\ + background-image: none !important;\ + background-color: " + backgroundColor + " !important;\ + }\ + \ + .toolbar-label {\ + color: " + color + " !important;\ + text-shadow: none;\ + }"; +} -(function() -{ -WebInspector.ElementsPanel.prototype._nodeSearchButtonClicked = function( event) +WebInspector.resetToolbarColors = function() { - InspectorBackend.toggleNodeSearch(); - this.nodeSearchButton.toggled = !this.nodeSearchButton.toggled; -}; -})(); - + if (WebInspector._themeStyleElement) + WebInspector._themeStyleElement.textContent = ""; -// We need to have a place for postponed tasks -// which should be executed when all the messages between agent and frontend -// are processed. - -WebInspector.runAfterPendingDispatchesQueue = []; +} -WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback) -{ - WebInspector.runAfterPendingDispatchesQueue.push(callback); -}; +//////////////////////////////////////////////////////// +// Platform-specific WebInspector extensions support. // +//////////////////////////////////////////////////////// -WebInspector.queuesAreEmpty = function() +WebInspector.platformExtensionAPI = function(tabId) { - var copy = this.runAfterPendingDispatchesQueue.slice(); - this.runAfterPendingDispatchesQueue = []; - for (var i = 0; i < copy.length; ++i) - copy[i].call(this); -}; + function getTabId() + { + return tabId; + } + webInspector.inspectedWindow.__proto__.__defineGetter__("tabId", getTabId); +} -(function() -{ -var originalAddToFrame = InspectorFrontendHost.addResourceSourceToFrame; -InspectorFrontendHost.addResourceSourceToFrame = function(identifier, element) +WebInspector.buildPlatformExtensionAPI = function() { - var resource = WebInspector.resources[identifier]; - if (!resource) - return; - originalAddToFrame.call(this, identifier, resource.mimeType, element); -}; -})(); + return "(" + WebInspector.platformExtensionAPI + ")(" + WebInspector._inspectedTabId + ");"; +} -WebInspector.pausedScript = function(callFrames) +WebInspector.setInspectedTabId = function(tabId) { - this.panels.scripts.debuggerPaused(callFrames); -}; + WebInspector._inspectedTabId = tabId; +} diff --git a/WebKit/chromium/src/js/DevToolsHostStub.js b/WebKit/chromium/src/js/DevToolsHostStub.js deleted file mode 100644 index 8b2f46b..0000000 --- a/WebKit/chromium/src/js/DevToolsHostStub.js +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -/** - * @fileoverview These stubs emulate backend functionality and allows - * DevTools frontend to function as a standalone web app. - */ - -if (!window["RemoteDebuggerAgent"]) { - -/** - * FIXME: change field naming style to use trailing underscore. - * @constructor - */ -RemoteDebuggerAgentStub = function() -{ -}; - - -RemoteDebuggerAgentStub.prototype.getContextId = function() -{ - RemoteDebuggerAgent.setContextId(3); -}; - - -RemoteDebuggerAgentStub.prototype.processDebugCommands = function() -{ -}; - - -/** - * @constructor - */ -RemoteProfilerAgentStub = function() -{ -}; - - -RemoteProfilerAgentStub.prototype.getActiveProfilerModules = function() -{ - ProfilerStubHelper.GetInstance().getActiveProfilerModules(); -}; - - -RemoteProfilerAgentStub.prototype.getLogLines = function(pos) -{ - ProfilerStubHelper.GetInstance().getLogLines(pos); -}; - - -/** - * @constructor - */ -RemoteToolsAgentStub = function() -{ -}; - - -RemoteToolsAgentStub.prototype.dispatchOnInjectedScript = function() -{ -}; - - -RemoteToolsAgentStub.prototype.dispatchOnInspectorController = function() -{ -}; - - -/** - * @constructor - */ -ProfilerStubHelper = function() -{ - this.activeProfilerModules_ = devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE; - this.heapProfSample_ = 0; - this.log_ = ''; -}; - - -ProfilerStubHelper.GetInstance = function() -{ - if (!ProfilerStubHelper.instance_) - ProfilerStubHelper.instance_ = new ProfilerStubHelper(); - return ProfilerStubHelper.instance_; -}; - - -ProfilerStubHelper.prototype.StopProfiling = function(modules) -{ - this.activeProfilerModules_ &= ~modules; -}; - - -ProfilerStubHelper.prototype.StartProfiling = function(modules) -{ - var profModules = devtools.ProfilerAgent.ProfilerModules; - if (modules & profModules.PROFILER_MODULE_HEAP_SNAPSHOT) { - if (modules & profModules.PROFILER_MODULE_HEAP_STATS) { - this.log_ += - 'heap-sample-begin,"Heap","allocated",' + - (new Date()).getTime() + '\n' + - 'heap-sample-stats,"Heap","allocated",10000,1000\n'; - this.log_ += - 'heap-sample-item,STRING_TYPE,100,1000\n' + - 'heap-sample-item,CODE_TYPE,10,200\n' + - 'heap-sample-item,MAP_TYPE,20,350\n'; - this.log_ += ProfilerStubHelper.HeapSamples[this.heapProfSample_++]; - this.heapProfSample_ %= ProfilerStubHelper.HeapSamples.length; - this.log_ += 'heap-sample-end,"Heap","allocated"\n'; - } - } else { - if (modules & profModules.PROFILER_MODULE_CPU) - this.log_ += ProfilerStubHelper.ProfilerLogBuffer; - this.activeProfilerModules_ |= modules; - } -}; - - -ProfilerStubHelper.prototype.getActiveProfilerModules = function() -{ - var self = this; - setTimeout(function() { - RemoteProfilerAgent.didGetActiveProfilerModules(self.activeProfilerModules_); - }, 100); -}; - - -ProfilerStubHelper.prototype.getLogLines = function(pos) -{ - var profModules = devtools.ProfilerAgent.ProfilerModules; - var logLines = this.log_.substr(pos); - setTimeout(function() { - RemoteProfilerAgent.didGetLogLines(pos + logLines.length, logLines); - }, 100); -}; - - -ProfilerStubHelper.ProfilerLogBuffer = - 'profiler,begin,1\n' + - 'profiler,resume\n' + - 'code-creation,LazyCompile,0x1000,256,"test1 http://aaa.js:1"\n' + - 'code-creation,LazyCompile,0x2000,256,"test2 http://bbb.js:2"\n' + - 'code-creation,LazyCompile,0x3000,256,"test3 http://ccc.js:3"\n' + - 'tick,0x1010,0x0,3\n' + - 'tick,0x2020,0x0,3,0x1010\n' + - 'tick,0x2020,0x0,3,0x1010\n' + - 'tick,0x3010,0x0,3,0x2020, 0x1010\n' + - 'tick,0x2020,0x0,3,0x1010\n' + - 'tick,0x2030,0x0,3,0x2020, 0x1010\n' + - 'tick,0x2020,0x0,3,0x1010\n' + - 'tick,0x1010,0x0,3\n' + - 'profiler,pause\n'; - - -ProfilerStubHelper.HeapSamples = [ - 'heap-js-cons-item,foo,1,100\n' + - 'heap-js-cons-item,bar,20,2000\n' + - 'heap-js-cons-item,Object,5,100\n' + - 'heap-js-ret-item,foo,bar;3\n' + - 'heap-js-ret-item,bar,foo;5\n' + - 'heap-js-ret-item,Object:0x1234,(roots);1\n', - - 'heap-js-cons-item,foo,2000,200000\n' + - 'heap-js-cons-item,bar,10,1000\n' + - 'heap-js-cons-item,Object,6,120\n' + - 'heap-js-ret-item,foo,bar;7,Object:0x1234;10\n' + - 'heap-js-ret-item,bar,foo;10,Object:0x1234;10\n' + - 'heap-js-ret-item,Object:0x1234,(roots);1\n', - - 'heap-js-cons-item,foo,15,1500\n' + - 'heap-js-cons-item,bar,15,1500\n' + - 'heap-js-cons-item,Object,5,100\n' + - 'heap-js-cons-item,Array,3,1000\n' + - 'heap-js-ret-item,foo,bar;3,Array:0x5678;1\n' + - 'heap-js-ret-item,bar,foo;5,Object:0x1234;8,Object:0x5678;2\n' + - 'heap-js-ret-item,Object:0x1234,(roots);1,Object:0x5678;2\n' + - 'heap-js-ret-item,Object:0x5678,(global property);3,Object:0x1234;5\n' + - 'heap-js-ret-item,Array:0x5678,(global property);3,Array:0x5678;2\n', - - 'heap-js-cons-item,bar,20,2000\n' + - 'heap-js-cons-item,Object,6,120\n' + - 'heap-js-ret-item,bar,foo;5,Object:0x1234;1,Object:0x1235;3\n' + - 'heap-js-ret-item,Object:0x1234,(global property);3\n' + - 'heap-js-ret-item,Object:0x1235,(global property);5\n', - - 'heap-js-cons-item,foo,15,1500\n' + - 'heap-js-cons-item,bar,15,1500\n' + - 'heap-js-cons-item,Array,10,1000\n' + - 'heap-js-ret-item,foo,bar;1,Array:0x5678;1\n' + - 'heap-js-ret-item,bar,foo;5\n' + - 'heap-js-ret-item,Array:0x5678,(roots);3\n', - - 'heap-js-cons-item,bar,20,2000\n' + - 'heap-js-cons-item,baz,15,1500\n' + - 'heap-js-ret-item,bar,baz;3\n' + - 'heap-js-ret-item,baz,bar;3\n' -]; - - -/** - * @constructor - */ -RemoteDebuggerCommandExecutorStub = function() -{ -}; - - -RemoteDebuggerCommandExecutorStub.prototype.DebuggerCommand = function(cmd) -{ - if ('{"seq":2,"type":"request","command":"scripts","arguments":{"includeSource":false}}' === cmd) { - var response1 = - '{"seq":5,"request_seq":2,"type":"response","command":"scripts","' + - 'success":true,"body":[{"handle":61,"type":"script","name":"' + - 'http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' + - '"lineCount":1,"sourceStart":"function fib(n) {","sourceLength":300,' + - '"scriptType":2,"compilationType":0,"context":{"ref":60}}],"refs":[{' + - '"handle":60,"type":"context","data":"page,3"}],"running":false}'; - this.sendResponse_(response1); - } else if ('{"seq":3,"type":"request","command":"scripts","arguments":{"ids":[59],"includeSource":true}}' === cmd) { - this.sendResponse_( - '{"seq":8,"request_seq":3,"type":"response","command":"scripts",' + - '"success":true,"body":[{"handle":1,"type":"script","name":' + - '"http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' + - '"lineCount":1,"source":"function fib(n) {return n+1;}",' + - '"sourceLength":244,"scriptType":2,"compilationType":0,"context":{' + - '"ref":0}}],"refs":[{"handle":0,"type":"context","data":"page,3}],"' + - '"running":false}'); - } else if (cmd.indexOf('"command":"profile"') !== -1) { - var cmdObj = JSON.parse(cmd); - if (cmdObj.arguments.command === "resume") - ProfilerStubHelper.GetInstance().StartProfiling(parseInt(cmdObj.arguments.modules)); - else if (cmdObj.arguments.command === "pause") - ProfilerStubHelper.GetInstance().StopProfiling(parseInt(cmdObj.arguments.modules)); - else - debugPrint("Unexpected profile command: " + cmdObj.arguments.command); - } else - debugPrint("Unexpected command: " + cmd); -}; - - -RemoteDebuggerCommandExecutorStub.prototype.DebuggerPauseScript = function() -{ -}; - - -RemoteDebuggerCommandExecutorStub.prototype.sendResponse_ = function(response) -{ - setTimeout(function() { - RemoteDebuggerAgent.debuggerOutput(response); - }, 0); -}; - - -DevToolsHostStub = function() -{ - this.isStub = true; -}; -DevToolsHostStub.prototype.__proto__ = WebInspector.InspectorFrontendHostStub.prototype; - - -DevToolsHostStub.prototype.reset = function() -{ -}; - - -DevToolsHostStub.prototype.setting = function() -{ -}; - - -DevToolsHostStub.prototype.setSetting = function() -{ -}; - - -window["RemoteDebuggerAgent"] = new RemoteDebuggerAgentStub(); -window["RemoteDebuggerCommandExecutor"] = new RemoteDebuggerCommandExecutorStub(); -window["RemoteProfilerAgent"] = new RemoteProfilerAgentStub(); -window["RemoteToolsAgent"] = new RemoteToolsAgentStub(); -InspectorFrontendHost = new DevToolsHostStub(); - -} diff --git a/WebKit/chromium/src/js/HeapProfilerPanel.js b/WebKit/chromium/src/js/HeapProfilerPanel.js deleted file mode 100644 index abbf580..0000000 --- a/WebKit/chromium/src/js/HeapProfilerPanel.js +++ /dev/null @@ -1,966 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -/** - * @fileoverview Heap profiler panel implementation. - */ - -WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) { - snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number); - snapshot.typeId = WebInspector.HeapSnapshotProfileType.TypeId; - - var snapshots = WebInspector.HeapSnapshotProfileType.snapshots; - snapshots.push(snapshot); - - snapshot.listIndex = snapshots.length - 1; - - if (WebInspector.CPUProfile) - this.addProfileHeader(WebInspector.HeapSnapshotProfileType.TypeId, snapshot); - else - this.addProfileHeader(snapshot); - - this.dispatchEventToListeners("snapshot added"); -} - - -WebInspector.HeapSnapshotView = function(parent, profile) -{ - WebInspector.View.call(this); - - this.element.addStyleClass("heap-snapshot-view"); - - this.parent = parent; - this.parent.addEventListener("snapshot added", this._updateBaseOptions, this); - - this.showCountAsPercent = false; - this.showSizeAsPercent = false; - this.showCountDeltaAsPercent = false; - this.showSizeDeltaAsPercent = false; - - this.categories = { - code: new WebInspector.ResourceCategory("code", WebInspector.UIString("Code"), "rgb(255,121,0)"), - data: new WebInspector.ResourceCategory("data", WebInspector.UIString("Objects"), "rgb(47,102,236)") - }; - - var summaryContainer = document.createElement("div"); - summaryContainer.id = "heap-snapshot-summary-container"; - - this.countsSummaryBar = new WebInspector.SummaryBar(this.categories); - this.countsSummaryBar.element.className = "heap-snapshot-summary"; - this.countsSummaryBar.calculator = new WebInspector.HeapSummaryCountCalculator(); - var countsLabel = document.createElement("div"); - countsLabel.className = "heap-snapshot-summary-label"; - countsLabel.textContent = WebInspector.UIString("Count"); - this.countsSummaryBar.element.appendChild(countsLabel); - summaryContainer.appendChild(this.countsSummaryBar.element); - - this.sizesSummaryBar = new WebInspector.SummaryBar(this.categories); - this.sizesSummaryBar.element.className = "heap-snapshot-summary"; - this.sizesSummaryBar.calculator = new WebInspector.HeapSummarySizeCalculator(); - var sizesLabel = document.createElement("label"); - sizesLabel.className = "heap-snapshot-summary-label"; - sizesLabel.textContent = WebInspector.UIString("Size"); - this.sizesSummaryBar.element.appendChild(sizesLabel); - summaryContainer.appendChild(this.sizesSummaryBar.element); - - this.element.appendChild(summaryContainer); - - var columns = { "cons": { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true }, - "count": { title: WebInspector.UIString("Count"), width: "54px", sortable: true }, - "size": { title: WebInspector.UIString("Size"), width: "72px", sort: "descending", sortable: true }, - "countDelta": { title: WebInspector.UIString("\xb1 Count"), width: "72px", sortable: true }, - "sizeDelta": { title: WebInspector.UIString("\xb1 Size"), width: "72px", sortable: true } }; - - this.dataGrid = new WebInspector.DataGrid(columns); - this.dataGrid.addEventListener("sorting changed", this._sortData, this); - this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true); - this.element.appendChild(this.dataGrid.element); - - this.profile = profile; - - this.baseSelectElement = document.createElement("select"); - this.baseSelectElement.className = "status-bar-item"; - this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false); - this._updateBaseOptions(); - if (this.profile.listIndex > 0) - this.baseSelectElement.selectedIndex = this.profile.listIndex - 1; - else - this.baseSelectElement.selectedIndex = this.profile.listIndex; - this._resetDataGridList(); - - this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item"); - this.percentButton.addEventListener("click", this._percentClicked.bind(this), false); - - this.refresh(); - - this._updatePercentButton(); -}; - -WebInspector.HeapSnapshotView.prototype = { - - get statusBarItems() - { - return [this.baseSelectElement, this.percentButton.element]; - }, - - get profile() - { - return this._profile; - }, - - set profile(profile) - { - this._profile = profile; - }, - - show: function(parentElement) - { - WebInspector.View.prototype.show.call(this, parentElement); - this.dataGrid.updateWidths(); - }, - - hide: function() - { - WebInspector.View.prototype.hide.call(this); - this._currentSearchResultIndex = -1; - }, - - resize: function() - { - if (this.dataGrid) - this.dataGrid.updateWidths(); - }, - - refresh: function() - { - this.dataGrid.removeChildren(); - - var children = this.snapshotDataGridList.children; - var count = children.length; - for (var index = 0; index < count; ++index) - this.dataGrid.appendChild(children[index]); - - this._updateSummaryGraph(); - }, - - refreshShowAsPercents: function() - { - this._updatePercentButton(); - this.refreshVisibleData(); - }, - - _deleteSearchMatchedFlags: function(node) - { - delete node._searchMatchedConsColumn; - delete node._searchMatchedCountColumn; - delete node._searchMatchedSizeColumn; - delete node._searchMatchedCountDeltaColumn; - delete node._searchMatchedSizeDeltaColumn; - }, - - searchCanceled: function() - { - if (this._searchResults) { - for (var i = 0; i < this._searchResults.length; ++i) { - var profileNode = this._searchResults[i].profileNode; - this._deleteSearchMatchedFlags(profileNode); - profileNode.refresh(); - } - } - - delete this._searchFinishedCallback; - this._currentSearchResultIndex = -1; - this._searchResults = []; - }, - - performSearch: function(query, finishedCallback) - { - // Call searchCanceled since it will reset everything we need before doing a new search. - this.searchCanceled(); - - query = query.trimWhitespace(); - - if (!query.length) - return; - - this._searchFinishedCallback = finishedCallback; - - var helper = WebInspector.HeapSnapshotView.SearchHelper; - - var operationAndNumber = helper.parseOperationAndNumber(query); - var operation = operationAndNumber[0]; - var queryNumber = operationAndNumber[1]; - - var percentUnits = helper.percents.test(query); - var megaBytesUnits = helper.megaBytes.test(query); - var kiloBytesUnits = helper.kiloBytes.test(query); - var bytesUnits = helper.bytes.test(query); - - var queryNumberBytes = (megaBytesUnits ? (queryNumber * 1024 * 1024) : (kiloBytesUnits ? (queryNumber * 1024) : queryNumber)); - - function matchesQuery(heapSnapshotDataGridNode) - { - WebInspector.HeapSnapshotView.prototype._deleteSearchMatchedFlags(heapSnapshotDataGridNode); - - if (percentUnits) { - heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.countPercent, queryNumber); - heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.sizePercent, queryNumber); - heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDeltaPercent, queryNumber); - heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDeltaPercent, queryNumber); - } else if (megaBytesUnits || kiloBytesUnits || bytesUnits) { - heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.size, queryNumberBytes); - heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDelta, queryNumberBytes); - } else { - heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.count, queryNumber); - heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDelta, queryNumber); - } - - if (heapSnapshotDataGridNode.constructorName.hasSubstring(query, true)) - heapSnapshotDataGridNode._searchMatchedConsColumn = true; - - if (heapSnapshotDataGridNode._searchMatchedConsColumn || - heapSnapshotDataGridNode._searchMatchedCountColumn || - heapSnapshotDataGridNode._searchMatchedSizeColumn || - heapSnapshotDataGridNode._searchMatchedCountDeltaColumn || - heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn) { - heapSnapshotDataGridNode.refresh(); - return true; - } - - return false; - } - - var current = this.snapshotDataGridList.children[0]; - var depth = 0; - var info = {}; - - // The second and subsequent levels of heap snapshot nodes represent retainers, - // so recursive expansion will be infinite, since a graph is being traversed. - // So default to a recursion cap of 2 levels. - var maxDepth = 2; - - while (current) { - if (matchesQuery(current)) - this._searchResults.push({ profileNode: current }); - current = current.traverseNextNode(false, null, (depth >= maxDepth), info); - depth += info.depthChange; - } - - finishedCallback(this, this._searchResults.length); - }, - - jumpToFirstSearchResult: WebInspector.CPUProfileView.prototype.jumpToFirstSearchResult, - jumpToLastSearchResult: WebInspector.CPUProfileView.prototype.jumpToLastSearchResult, - jumpToNextSearchResult: WebInspector.CPUProfileView.prototype.jumpToNextSearchResult, - jumpToPreviousSearchResult: WebInspector.CPUProfileView.prototype.jumpToPreviousSearchResult, - showingFirstSearchResult: WebInspector.CPUProfileView.prototype.showingFirstSearchResult, - showingLastSearchResult: WebInspector.CPUProfileView.prototype.showingLastSearchResult, - _jumpToSearchResult: WebInspector.CPUProfileView.prototype._jumpToSearchResult, - - refreshVisibleData: function() - { - var child = this.dataGrid.children[0]; - while (child) { - child.refresh(); - child = child.traverseNextNode(false, null, true); - } - this._updateSummaryGraph(); - }, - - _changeBase: function() { - if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex]) - return; - - this._resetDataGridList(); - this.refresh(); - - if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults) - return; - - // The current search needs to be performed again. First negate out previous match - // count by calling the search finished callback with a negative number of matches. - // Then perform the search again with the same query and callback. - this._searchFinishedCallback(this, -this._searchResults.length); - this.performSearch(this.currentQuery, this._searchFinishedCallback); - }, - - _createSnapshotDataGridList: function() - { - if (this._snapshotDataGridList) - delete this._snapshotDataGridList; - - this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(this, this.baseSnapshot.entries, this.profile.entries); - return this._snapshotDataGridList; - }, - - _mouseDownInDataGrid: function(event) - { - if (event.detail < 2) - return; - - var cell = event.target.enclosingNodeOrSelfWithNodeName("td"); - if (!cell || (!cell.hasStyleClass("count-column") && !cell.hasStyleClass("size-column") && !cell.hasStyleClass("countDelta-column") && !cell.hasStyleClass("sizeDelta-column"))) - return; - - if (cell.hasStyleClass("count-column")) - this.showCountAsPercent = !this.showCountAsPercent; - else if (cell.hasStyleClass("size-column")) - this.showSizeAsPercent = !this.showSizeAsPercent; - else if (cell.hasStyleClass("countDelta-column")) - this.showCountDeltaAsPercent = !this.showCountDeltaAsPercent; - else if (cell.hasStyleClass("sizeDelta-column")) - this.showSizeDeltaAsPercent = !this.showSizeDeltaAsPercent; - - this.refreshShowAsPercents(); - - event.preventDefault(); - event.stopPropagation(); - }, - - get _isShowingAsPercent() - { - return this.showCountAsPercent && this.showSizeAsPercent && this.showCountDeltaAsPercent && this.showSizeDeltaAsPercent; - }, - - _percentClicked: function(event) - { - var currentState = this._isShowingAsPercent; - this.showCountAsPercent = !currentState; - this.showSizeAsPercent = !currentState; - this.showCountDeltaAsPercent = !currentState; - this.showSizeDeltaAsPercent = !currentState; - this.refreshShowAsPercents(); - }, - - _resetDataGridList: function() - { - this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex]; - var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyComparator("size", false); - if (this.snapshotDataGridList) - lastComparator = this.snapshotDataGridList.lastComparator; - this.snapshotDataGridList = this._createSnapshotDataGridList(); - this.snapshotDataGridList.sort(lastComparator, true); - }, - - _sortData: function() - { - var sortAscending = this.dataGrid.sortOrder === "ascending"; - var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier; - var sortProperty = { - "cons": ["constructorName", null], - "count": ["count", null], - "size": ["size", "count"], - "countDelta": this.showCountDeltaAsPercent ? ["countDeltaPercent", null] : ["countDelta", null], - "sizeDelta": this.showSizeDeltaAsPercent ? ["sizeDeltaPercent", "countDeltaPercent"] : ["sizeDelta", "sizeDeltaPercent"] - }[sortColumnIdentifier]; - - this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.propertyComparator(sortProperty[0], sortProperty[1], sortAscending)); - - this.refresh(); - }, - - _updateBaseOptions: function() - { - var list = WebInspector.HeapSnapshotProfileType.snapshots; - // We're assuming that snapshots can only be added. - if (this.baseSelectElement.length === list.length) - return; - - for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) { - var baseOption = document.createElement("option"); - baseOption.label = WebInspector.UIString("Compared to %s", list[i].title); - this.baseSelectElement.appendChild(baseOption); - } - }, - - _updatePercentButton: function() - { - if (this._isShowingAsPercent) { - this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes."); - this.percentButton.toggled = true; - } else { - this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages."); - this.percentButton.toggled = false; - } - }, - - _updateSummaryGraph: function() - { - this.countsSummaryBar.calculator.showAsPercent = this._isShowingAsPercent; - this.countsSummaryBar.update(this.profile.lowlevels); - - this.sizesSummaryBar.calculator.showAsPercent = this._isShowingAsPercent; - this.sizesSummaryBar.update(this.profile.lowlevels); - } -}; - -WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype; - -WebInspector.HeapSnapshotView.SearchHelper = { - // In comparators, we assume that a value from a node is passed as the first parameter. - operations: { LESS: function (a, b) { return a !== null && a < b; }, - LESS_OR_EQUAL: function (a, b) { return a !== null && a <= b; }, - EQUAL: function (a, b) { return a !== null && a === b; }, - GREATER_OR_EQUAL: function (a, b) { return a !== null && a >= b; }, - GREATER: function (a, b) { return a !== null && a > b; } }, - - operationParsers: { LESS: /^<(\d+)/, - LESS_OR_EQUAL: /^<=(\d+)/, - GREATER_OR_EQUAL: /^>=(\d+)/, - GREATER: /^>(\d+)/ }, - - parseOperationAndNumber: function(query) - { - var operations = WebInspector.HeapSnapshotView.SearchHelper.operations; - var parsers = WebInspector.HeapSnapshotView.SearchHelper.operationParsers; - for (var operation in parsers) { - var match = query.match(parsers[operation]); - if (match !== null) - return [operations[operation], parseFloat(match[1])]; - } - return [operations.EQUAL, parseFloat(query)]; - }, - - percents: /%$/, - - megaBytes: /MB$/i, - - kiloBytes: /KB$/i, - - bytes: /B$/i -} - -WebInspector.HeapSummaryCalculator = function(lowLevelField) -{ - this.total = 1; - this.lowLevelField = lowLevelField; -} - -WebInspector.HeapSummaryCalculator.prototype = { - computeSummaryValues: function(lowLevels) - { - var highLevels = {data: 0, code: 0}; - this.total = 0; - for (var item in lowLevels) { - var highItem = this._highFromLow(item); - if (highItem) { - var value = lowLevels[item][this.lowLevelField]; - highLevels[highItem] += value; - this.total += value; - } - } - var result = {categoryValues: highLevels}; - if (!this.showAsPercent) - result.total = this.total; - return result; - }, - - formatValue: function(value) - { - if (this.showAsPercent) - return WebInspector.UIString("%.2f%%", value / this.total * 100.0); - else - return this._valueToString(value); - }, - - get showAsPercent() - { - return this._showAsPercent; - }, - - set showAsPercent(x) - { - this._showAsPercent = x; - } -} - -WebInspector.HeapSummaryCountCalculator = function() -{ - WebInspector.HeapSummaryCalculator.call(this, "count"); -} - -WebInspector.HeapSummaryCountCalculator.prototype = { - _highFromLow: function(type) { - if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code"; - if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/)) return "data"; - return null; - }, - - _valueToString: function(value) { - return value.toString(); - } -} - -WebInspector.HeapSummaryCountCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype; - -WebInspector.HeapSummarySizeCalculator = function() -{ - WebInspector.HeapSummaryCalculator.call(this, "size"); -} - -WebInspector.HeapSummarySizeCalculator.prototype = { - _highFromLow: function(type) { - if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code"; - if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/) || type.match(/_ARRAY_TYPE$/)) return "data"; - return null; - }, - - _valueToString: Number.bytesToString -} - -WebInspector.HeapSummarySizeCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype; - -WebInspector.HeapSnapshotSidebarTreeElement = function(snapshot) -{ - this.profile = snapshot; - - WebInspector.SidebarTreeElement.call(this, "heap-snapshot-sidebar-tree-item", "", "", snapshot, false); - - this.refreshTitles(); -}; - -WebInspector.HeapSnapshotSidebarTreeElement.prototype = { - get mainTitle() - { - if (this._mainTitle) - return this._mainTitle; - return this.profile.title; - }, - - set mainTitle(x) - { - this._mainTitle = x; - this.refreshTitles(); - } -}; - -WebInspector.HeapSnapshotSidebarTreeElement.prototype.__proto__ = WebInspector.ProfileSidebarTreeElement.prototype; - -WebInspector.HeapSnapshotDataGridNodeWithRetainers = function(owningTree) -{ - this.tree = owningTree; - - WebInspector.DataGridNode.call(this, null, this._hasRetainers); - - this.addEventListener("populate", this._populate, this); -}; - -WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype = { - isEmptySet: function(set) - { - for (var x in set) - return false; - return true; - }, - - get _hasRetainers() - { - return !this.isEmptySet(this.retainers); - }, - - get _parent() - { - // For top-level nodes, return owning tree as a parent, not data grid. - return this.parent !== this.dataGrid ? this.parent : this.tree; - }, - - _populate: function(event) - { - var self = this; - this.produceDiff(this.baseRetainers, this.retainers, function(baseItem, snapshotItem) { - self.appendChild(new WebInspector.HeapSnapshotDataGridRetainerNode(self.snapshotView, baseItem, snapshotItem, self.tree)); - }); - - if (this._parent) { - var currentComparator = this._parent.lastComparator; - if (currentComparator) - this.sort(currentComparator, true); - } - - this.removeEventListener("populate", this._populate, this); - }, - - produceDiff: function(baseEntries, currentEntries, callback) - { - for (var item in currentEntries) - callback(baseEntries[item], currentEntries[item]); - - for (item in baseEntries) { - if (!(item in currentEntries)) - callback(baseEntries[item], null); - } - }, - - sort: function(comparator, force) { - if (!force && this.lastComparator === comparator) - return; - - this.children.sort(comparator); - var childCount = this.children.length; - for (var childIndex = 0; childIndex < childCount; ++childIndex) - this.children[childIndex]._recalculateSiblings(childIndex); - for (var i = 0; i < this.children.length; ++i) { - var child = this.children[i]; - if (!force && (!child.expanded || child.lastComparator === comparator)) - continue; - child.sort(comparator, force); - } - this.lastComparator = comparator; - }, - - signForDelta: function(delta) { - if (delta === 0) - return ""; - if (delta > 0) - return "+"; - else - // Math minus sign, same width as plus. - return "\u2212"; - }, - - showDeltaAsPercent: function(value) { - if (value === Number.POSITIVE_INFINITY) - return WebInspector.UIString("new"); - else if (value === Number.NEGATIVE_INFINITY) - return WebInspector.UIString("deleted"); - if (value > 1000.0) - return WebInspector.UIString("%s >1000%%", this.signForDelta(value)); - return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.abs(value)); - }, - - getTotalCount: function() { - if (!this._count) { - this._count = 0; - for (var i = 0, n = this.children.length; i < n; ++i) - this._count += this.children[i].count; - } - return this._count; - }, - - getTotalSize: function() { - if (!this._size) { - this._size = 0; - for (var i = 0, n = this.children.length; i < n; ++i) - this._size += this.children[i].size; - } - return this._size; - }, - - get countPercent() - { - return this.count / this._parent.getTotalCount() * 100.0; - }, - - get sizePercent() - { - return this.size / this._parent.getTotalSize() * 100.0; - }, - - get countDeltaPercent() - { - if (this.baseCount > 0) { - if (this.count > 0) - return this.countDelta / this.baseCount * 100.0; - else - return Number.NEGATIVE_INFINITY; - } else - return Number.POSITIVE_INFINITY; - }, - - get sizeDeltaPercent() - { - if (this.baseSize > 0) { - if (this.size > 0) - return this.sizeDelta / this.baseSize * 100.0; - else - return Number.NEGATIVE_INFINITY; - } else - return Number.POSITIVE_INFINITY; - }, - - get data() - { - var data = {}; - - data["cons"] = this.constructorName; - - if (this.snapshotView.showCountAsPercent) - data["count"] = WebInspector.UIString("%.2f%%", this.countPercent); - else - data["count"] = this.count; - - if (this.size !== null) { - if (this.snapshotView.showSizeAsPercent) - data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent); - else - data["size"] = Number.bytesToString(this.size); - } else - data["size"] = ""; - - if (this.snapshotView.showCountDeltaAsPercent) - data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent); - else - data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta(this.countDelta), Math.abs(this.countDelta)); - - if (this.sizeDelta !== null) { - if (this.snapshotView.showSizeDeltaAsPercent) - data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercent); - else - data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDelta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta))); - } else - data["sizeDelta"] = ""; - - return data; - }, - - createCell: function(columnIdentifier) - { - var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier); - - if ((columnIdentifier === "cons" && this._searchMatchedConsColumn) || - (columnIdentifier === "count" && this._searchMatchedCountColumn) || - (columnIdentifier === "size" && this._searchMatchedSizeColumn) || - (columnIdentifier === "countDelta" && this._searchMatchedCountDeltaColumn) || - (columnIdentifier === "sizeDelta" && this._searchMatchedSizeDeltaColumn)) - cell.addStyleClass("highlight"); - - return cell; - } -}; - -WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInspector.DataGridNode.prototype; - -WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapshotEntry, owningTree) -{ - this.snapshotView = snapshotView; - - if (!snapshotEntry) - snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {} }; - this.constructorName = snapshotEntry.cons; - this.count = snapshotEntry.count; - this.size = snapshotEntry.size; - this.retainers = snapshotEntry.retainers; - - if (!baseEntry) - baseEntry = { count: 0, size: 0, retainers: {} }; - this.baseCount = baseEntry.count; - this.countDelta = this.count - this.baseCount; - this.baseSize = baseEntry.size; - this.sizeDelta = this.size - this.baseSize; - this.baseRetainers = baseEntry.retainers; - - WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree); -}; - -WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype; - -WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snapshotEntries) -{ - this.tree = this; - this.snapshotView = snapshotView; - this.children = []; - this.lastComparator = null; - this.populateChildren(baseEntries, snapshotEntries); -}; - -WebInspector.HeapSnapshotDataGridList.prototype = { - appendChild: function(child) - { - this.insertChild(child, this.children.length); - }, - - insertChild: function(child, index) - { - this.children.splice(index, 0, child); - }, - - removeChildren: function() - { - this.children = []; - }, - - populateChildren: function(baseEntries, snapshotEntries) - { - var self = this; - this.produceDiff(baseEntries, snapshotEntries, function(baseItem, snapshotItem) { - self.appendChild(new WebInspector.HeapSnapshotDataGridNode(self.snapshotView, baseItem, snapshotItem, self)); - }); - }, - - produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.produceDiff, - sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort, - getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalCount, - getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalSize -}; - -WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}]; - -WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, property2, isAscending) -{ - var propertyHash = property + "#" + property2; - var comparator = this.propertyComparators[(isAscending ? 1 : 0)][propertyHash]; - if (!comparator) { - comparator = function(lhs, rhs) { - var l = lhs[property], r = rhs[property]; - if ((l === null || r === null) && property2 !== null) - l = lhs[property2], r = rhs[property2]; - var result = l < r ? -1 : (l > r ? 1 : 0); - return isAscending ? result : -result; - }; - this.propertyComparators[(isAscending ? 1 : 0)][propertyHash] = comparator; - } - return comparator; -}; - -WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry, snapshotEntry, owningTree) -{ - this.snapshotView = snapshotView; - - if (!snapshotEntry) - snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} }; - this.constructorName = snapshotEntry.cons; - this.count = snapshotEntry.count; - this.retainers = this._calculateRetainers(this.snapshotView.profile, snapshotEntry.clusters); - - if (!baseEntry) - baseEntry = { count: 0, clusters: {} }; - this.baseCount = baseEntry.count; - this.countDelta = this.count - this.baseCount; - this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot, baseEntry.clusters); - - this.size = null; - this.sizeDelta = null; - - WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree); -} - -WebInspector.HeapSnapshotDataGridRetainerNode.prototype = { - get sizePercent() - { - return null; - }, - - get sizeDeltaPercent() - { - return null; - }, - - _calculateRetainers: function(snapshot, clusters) { - var retainers = {}; - if (this.isEmptySet(clusters)) { - if (this.constructorName in snapshot.entries) - return snapshot.entries[this.constructorName].retainers; - } else { - // In case when an entry is retained by clusters, we need to gather up the list - // of retainers by merging retainers of every cluster. - // E.g. having such a tree: - // A - // Object:1 10 - // X 3 - // Y 4 - // Object:2 5 - // X 6 - // - // will result in a following retainers list: X 9, Y 4. - for (var clusterName in clusters) { - if (clusterName in snapshot.clusters) { - var clusterRetainers = snapshot.clusters[clusterName].retainers; - for (var clusterRetainer in clusterRetainers) { - var clusterRetainerEntry = clusterRetainers[clusterRetainer]; - if (!(clusterRetainer in retainers)) - retainers[clusterRetainer] = { cons: clusterRetainerEntry.cons, count: 0, clusters: {} }; - retainers[clusterRetainer].count += clusterRetainerEntry.count; - for (var clusterRetainerCluster in clusterRetainerEntry.clusters) - retainers[clusterRetainer].clusters[clusterRetainerCluster] = true; - } - } - } - } - return retainers; - } -}; - -WebInspector.HeapSnapshotDataGridRetainerNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype; - - -WebInspector.HeapSnapshotProfileType = function() -{ - WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS")); -} - -WebInspector.HeapSnapshotProfileType.TypeId = "HEAP"; - -WebInspector.HeapSnapshotProfileType.snapshots = []; - -WebInspector.HeapSnapshotProfileType.prototype = { - get buttonTooltip() - { - return WebInspector.UIString("Take heap snapshot."); - }, - - get buttonStyle() - { - return "heap-snapshot-status-bar-item status-bar-item"; - }, - - buttonClicked: function() - { - InspectorBackend.takeHeapSnapshot(); - }, - - get welcomeMessage() - { - return WebInspector.UIString("Get a heap snapshot by pressing<br>the %s button on the status bar."); - }, - - createSidebarTreeElementForProfile: function(profile) - { - var element = new WebInspector.HeapSnapshotSidebarTreeElement(profile); - element.small = false; - return element; - }, - - createView: function(profile) - { - return new WebInspector.HeapSnapshotView(WebInspector.panels.profiles, profile); - } -} - -WebInspector.HeapSnapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype; - - -(function() { - var originalCreatePanels = WebInspector._createPanels; - WebInspector._createPanels = function() { - originalCreatePanels.apply(this, arguments); - if (WebInspector.panels.profiles) - WebInspector.panels.profiles.registerProfileType(new WebInspector.HeapSnapshotProfileType()); - } -})(); diff --git a/WebKit/chromium/src/js/Images/segmentChromium.png b/WebKit/chromium/src/js/Images/segmentChromium.png Binary files differindex 607559b..f4248e1 100755 --- a/WebKit/chromium/src/js/Images/segmentChromium.png +++ b/WebKit/chromium/src/js/Images/segmentChromium.png diff --git a/WebKit/chromium/src/js/Images/statusbarBackgroundChromium.png b/WebKit/chromium/src/js/Images/statusbarBackgroundChromium.png Binary files differindex 9d326ac..7a760c1 100755 --- a/WebKit/chromium/src/js/Images/statusbarBackgroundChromium.png +++ b/WebKit/chromium/src/js/Images/statusbarBackgroundChromium.png diff --git a/WebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.png b/WebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.png Binary files differindex 7c7db0a..e3bc944 100755 --- a/WebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.png +++ b/WebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.png diff --git a/WebKit/chromium/src/js/Images/statusbarButtonsChromium.png b/WebKit/chromium/src/js/Images/statusbarButtonsChromium.png Binary files differindex 0c6635d..136d5a8 100755 --- a/WebKit/chromium/src/js/Images/statusbarButtonsChromium.png +++ b/WebKit/chromium/src/js/Images/statusbarButtonsChromium.png diff --git a/WebKit/chromium/src/js/Images/statusbarMenuButtonChromium.png b/WebKit/chromium/src/js/Images/statusbarMenuButtonChromium.png Binary files differindex bf26684..5ff61d9 100755 --- a/WebKit/chromium/src/js/Images/statusbarMenuButtonChromium.png +++ b/WebKit/chromium/src/js/Images/statusbarMenuButtonChromium.png diff --git a/WebKit/chromium/src/js/InjectDispatch.js b/WebKit/chromium/src/js/InjectDispatch.js deleted file mode 100644 index e070c42..0000000 --- a/WebKit/chromium/src/js/InjectDispatch.js +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -/** - * @fileoverview Injects "injected" object into the inspectable page. - */ - - -var InspectorControllerDispatcher = {}; - -/** - * Main dispatch method, all calls from the host to InspectorController go - * through this one. - * @param {string} functionName Function to call - * @param {string} json_args JSON-serialized call parameters. - * @return {string} JSON-serialized result of the dispatched call. - */ -InspectorControllerDispatcher.dispatch = function(functionName, json_args) -{ - var params = JSON.parse(json_args); - InspectorBackend[functionName].apply(InspectorBackend, params); -}; - -/** - * Special controller object for APU related messages. Outgoing messages - * are sent to this object if the ApuAgentDispatcher is enabled. - **/ -var ApuAgentDispatcher = { enabled : false }; - -/** - * Dispatches messages to APU. This filters and transforms - * outgoing messages that are used by APU. - * @param {string} method name of the dispatch method. - **/ -ApuAgentDispatcher.dispatchToApu = function(method, args) -{ - if (method !== "addRecordToTimeline" && method !== "updateResource" && method !== "addResource") - return; - // TODO(knorton): Transform args so they can be used - // by APU. - DevToolsAgentHost.dispatchToApu(JSON.stringify(args)); -}; - -/** - * This is called by the InspectorFrontend for serialization. - * We serialize the call and send it to the client over the IPC - * using dispatchOut bound method. - */ -function dispatch(method, var_args) { - // Handle all messages with non-primitieve arguments here. - var args = Array.prototype.slice.call(arguments); - - if (method === "inspectedWindowCleared" || method === "reset" || method === "setAttachedWindow") { - // Filter out messages we don't need here. - // We do it on the sender side since they may have non-serializable - // parameters. - return; - } - - // Sniff some inspector controller state changes in order to support - // cross-navigation instrumentation. Keep names in sync with - // webdevtoolsagent_impl. - if (method === "timelineProfilerWasStarted") - DevToolsAgentHost.runtimeFeatureStateChanged("timeline-profiler", true); - else if (method === "timelineProfilerWasStopped") - DevToolsAgentHost.runtimeFeatureStateChanged("timeline-profiler", false); - else if (method === "resourceTrackingWasEnabled") - DevToolsAgentHost.runtimeFeatureStateChanged("resource-tracking", true); - else if (method === "resourceTrackingWasDisabled") - DevToolsAgentHost.runtimeFeatureStateChanged("resource-tracking", false); - - if (ApuAgentDispatcher.enabled) { - ApuAgentDispatcher.dispatchToApu(method, args); - return; - } - - var call = JSON.stringify(args); - DevToolsAgentHost.dispatch(call); -}; diff --git a/WebKit/chromium/src/js/InspectorControllerImpl.js b/WebKit/chromium/src/js/InspectorControllerImpl.js deleted file mode 100644 index c92a94c..0000000 --- a/WebKit/chromium/src/js/InspectorControllerImpl.js +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -/** - * @fileoverview DevTools' implementation of the InspectorController API. - */ - -if (!this.devtools) - devtools = {}; - -devtools.InspectorBackendImpl = function() -{ - WebInspector.InspectorBackendStub.call(this); - this.installInspectorControllerDelegate_("clearMessages"); - this.installInspectorControllerDelegate_("copyNode"); - this.installInspectorControllerDelegate_("deleteCookie"); - this.installInspectorControllerDelegate_("didEvaluateForTestInFrontend"); - this.installInspectorControllerDelegate_("disableResourceTracking"); - this.installInspectorControllerDelegate_("disableTimeline"); - this.installInspectorControllerDelegate_("enableResourceTracking"); - this.installInspectorControllerDelegate_("enableTimeline"); - this.installInspectorControllerDelegate_("getChildNodes"); - this.installInspectorControllerDelegate_("getCookies"); - this.installInspectorControllerDelegate_("getDatabaseTableNames"); - this.installInspectorControllerDelegate_("getDOMStorageEntries"); - this.installInspectorControllerDelegate_("getEventListenersForNode"); - this.installInspectorControllerDelegate_("getResourceContent"); - this.installInspectorControllerDelegate_("highlightDOMNode"); - this.installInspectorControllerDelegate_("hideDOMNodeHighlight"); - this.installInspectorControllerDelegate_("releaseWrapperObjectGroup"); - this.installInspectorControllerDelegate_("removeAttribute"); - this.installInspectorControllerDelegate_("removeDOMStorageItem"); - this.installInspectorControllerDelegate_("removeNode"); - this.installInspectorControllerDelegate_("saveFrontendSettings"); - this.installInspectorControllerDelegate_("setAttribute"); - this.installInspectorControllerDelegate_("setDOMStorageItem"); - this.installInspectorControllerDelegate_("setInjectedScriptSource"); - this.installInspectorControllerDelegate_("setTextNodeValue"); - this.installInspectorControllerDelegate_("startTimelineProfiler"); - this.installInspectorControllerDelegate_("stopTimelineProfiler"); - this.installInspectorControllerDelegate_("storeLastActivePanel"); -}; -devtools.InspectorBackendImpl.prototype.__proto__ = WebInspector.InspectorBackendStub.prototype; - - -/** - * {@inheritDoc}. - */ -devtools.InspectorBackendImpl.prototype.toggleNodeSearch = function() -{ - WebInspector.InspectorBackendStub.prototype.toggleNodeSearch.call(this); - this.callInspectorController_.call(this, "toggleNodeSearch"); - if (!this.searchingForNode()) { - // This is called from ElementsPanel treeOutline's focusNodeChanged(). - DevToolsHost.activateWindow(); - } -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.debuggerEnabled = function() -{ - return true; -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.profilerEnabled = function() -{ - return true; -}; - - -devtools.InspectorBackendImpl.prototype.addBreakpoint = function(sourceID, line, condition) -{ - devtools.tools.getDebuggerAgent().addBreakpoint(sourceID, line, condition); -}; - - -devtools.InspectorBackendImpl.prototype.removeBreakpoint = function(sourceID, line) -{ - devtools.tools.getDebuggerAgent().removeBreakpoint(sourceID, line); -}; - -devtools.InspectorBackendImpl.prototype.updateBreakpoint = function(sourceID, line, condition) -{ - devtools.tools.getDebuggerAgent().updateBreakpoint(sourceID, line, condition); -}; - -devtools.InspectorBackendImpl.prototype.pauseInDebugger = function() -{ - devtools.tools.getDebuggerAgent().pauseExecution(); -}; - - -devtools.InspectorBackendImpl.prototype.resumeDebugger = function() -{ - devtools.tools.getDebuggerAgent().resumeExecution(); -}; - - -devtools.InspectorBackendImpl.prototype.stepIntoStatementInDebugger = function() -{ - devtools.tools.getDebuggerAgent().stepIntoStatement(); -}; - - -devtools.InspectorBackendImpl.prototype.stepOutOfFunctionInDebugger = function() -{ - devtools.tools.getDebuggerAgent().stepOutOfFunction(); -}; - - -devtools.InspectorBackendImpl.prototype.stepOverStatementInDebugger = function() -{ - devtools.tools.getDebuggerAgent().stepOverStatement(); -}; - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.setPauseOnExceptionsState = function(state) -{ - this._setPauseOnExceptionsState = state; - // TODO(yurys): support all three states. See http://crbug.com/32877 - var enabled = (state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions); - return devtools.tools.getDebuggerAgent().setPauseOnExceptions(enabled); -}; - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.pauseOnExceptionsState = function() -{ - return (this._setPauseOnExceptionsState || WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions); -}; - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.pauseOnExceptions = function() -{ - return devtools.tools.getDebuggerAgent().pauseOnExceptions(); -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.setPauseOnExceptions = function(value) -{ - return devtools.tools.getDebuggerAgent().setPauseOnExceptions(value); -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.startProfiling = function() -{ - devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU); -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.stopProfiling = function() -{ - devtools.tools.getProfilerAgent().stopProfiling( devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU); -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.getProfileHeaders = function(callId) -{ - WebInspector.didGetProfileHeaders(callId, []); -}; - - -/** - * Emulate WebKit InspectorController behavior. It stores profiles on renderer side, - * and is able to retrieve them by uid using "getProfile". - */ -devtools.InspectorBackendImpl.prototype.addFullProfile = function(profile) -{ - WebInspector.__fullProfiles = WebInspector.__fullProfiles || {}; - WebInspector.__fullProfiles[profile.uid] = profile; -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.getProfile = function(callId, uid) -{ - if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles)) - WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]); -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.takeHeapSnapshot = function() -{ - devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT - | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_STATS - | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_JS_CONSTRUCTORS); -}; - - -/** - * @override - */ -devtools.InspectorBackendImpl.prototype.dispatchOnInjectedScript = function(callId, injectedScriptId, methodName, argsString, async) -{ - // Encode injectedScriptId into callId - if (typeof injectedScriptId !== "number") - injectedScriptId = 0; - RemoteToolsAgent.dispatchOnInjectedScript(callId, injectedScriptId, methodName, argsString, async); -}; - - -/** - * Installs delegating handler into the inspector controller. - * @param {string} methodName Method to install delegating handler for. - */ -devtools.InspectorBackendImpl.prototype.installInspectorControllerDelegate_ = function(methodName) -{ - this[methodName] = this.callInspectorController_.bind(this, methodName); -}; - - -/** - * Bound function with the installInjectedScriptDelegate_ actual - * implementation. - */ -devtools.InspectorBackendImpl.prototype.callInspectorController_ = function(methodName, var_arg) -{ - var args = Array.prototype.slice.call(arguments, 1); - RemoteToolsAgent.dispatchOnInspectorController(WebInspector.Callback.wrap(function(){}), methodName, JSON.stringify(args)); -}; - - -InspectorBackend = new devtools.InspectorBackendImpl(); diff --git a/WebKit/chromium/src/js/ProfilerAgent.js b/WebKit/chromium/src/js/ProfilerAgent.js deleted file mode 100644 index e08c5d2..0000000 --- a/WebKit/chromium/src/js/ProfilerAgent.js +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -/** - * @fileoverview Provides communication interface to remote v8 profiler. - */ - -/** - * @constructor - */ -devtools.ProfilerAgent = function() -{ - RemoteProfilerAgent.didGetActiveProfilerModules = this._didGetActiveProfilerModules.bind(this); - RemoteProfilerAgent.didGetLogLines = this._didGetLogLines.bind(this); - - /** - * Active profiler modules flags. - * @type {number} - */ - this._activeProfilerModules = devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE; - - /** - * Interval for polling profiler state. - * @type {number} - */ - this._getActiveProfilerModulesInterval = null; - - /** - * Profiler log position. - * @type {number} - */ - this._logPosition = 0; - - /** - * Last requested log position. - * @type {number} - */ - this._lastRequestedLogPosition = -1; - - /** - * Whether log contents retrieval must be forced next time. - * @type {boolean} - */ - this._forceGetLogLines = false; - - /** - * Profiler processor instance. - * @type {devtools.profiler.Processor} - */ - this._profilerProcessor = new devtools.profiler.Processor(); -}; - - -/** - * A copy of enum from include/v8.h - * @enum {number} - */ -devtools.ProfilerAgent.ProfilerModules = { - PROFILER_MODULE_NONE: 0, - PROFILER_MODULE_CPU: 1, - PROFILER_MODULE_HEAP_STATS: 1 << 1, - PROFILER_MODULE_JS_CONSTRUCTORS: 1 << 2, - PROFILER_MODULE_HEAP_SNAPSHOT: 1 << 16 -}; - - -/** - * Sets up callbacks that deal with profiles processing. - */ -devtools.ProfilerAgent.prototype.setupProfilerProcessorCallbacks = function() -{ - // A temporary icon indicating that the profile is being processed. - var processingIcon = new WebInspector.SidebarTreeElement( - "profile-sidebar-tree-item", - WebInspector.UIString("Processing..."), - '', null, false); - var profilesSidebar = WebInspector.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).treeElement; - - this._profilerProcessor.setCallbacks( - function onProfileProcessingStarted() { - // Set visually empty string. Subtitle hiding is done via styles - // manipulation which doesn't play well with dynamic append / removal. - processingIcon.subtitle = " "; - profilesSidebar.appendChild(processingIcon); - }, - function onProfileProcessingStatus(ticksCount) { - processingIcon.subtitle = WebInspector.UIString("%d ticks processed", ticksCount); - }, - function onProfileProcessingFinished(profile) { - profilesSidebar.removeChild(processingIcon); - profile.typeId = WebInspector.CPUProfileType.TypeId; - InspectorBackend.addFullProfile(profile); - WebInspector.addProfileHeader(profile); - // If no profile is currently shown, show the new one. - var profilesPanel = WebInspector.panels.profiles; - if (!profilesPanel.visibleView) { - profilesPanel.showProfile(profile); - } - } - ); -}; - - -/** - * Initializes profiling state. - */ -devtools.ProfilerAgent.prototype.initializeProfiling = function() -{ - this.setupProfilerProcessorCallbacks(); - this._forceGetLogLines = true; - this._getActiveProfilerModulesInterval = setInterval(function() { RemoteProfilerAgent.getActiveProfilerModules(); }, 1000); -}; - - -/** - * Requests the next chunk of log lines. - * @param {boolean} immediately Do not postpone the request. - * @private - */ -devtools.ProfilerAgent.prototype._getNextLogLines = function(immediately) -{ - if (this._lastRequestedLogPosition == this._logPosition) - return; - var pos = this._lastRequestedLogPosition = this._logPosition; - if (immediately) - RemoteProfilerAgent.getLogLines(pos); - else - setTimeout(function() { RemoteProfilerAgent.getLogLines(pos); }, 500); -}; - - -/** - * Starts profiling. - * @param {number} modules List of modules to enable. - */ -devtools.ProfilerAgent.prototype.startProfiling = function(modules) -{ - var cmd = new devtools.DebugCommand("profile", { - "modules": modules, - "command": "resume"}); - devtools.DebuggerAgent.sendCommand_(cmd); - RemoteDebuggerAgent.processDebugCommands(); - if (modules & devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT) { - // Active modules will not change, instead, a snapshot will be logged. - this._getNextLogLines(); - } -}; - - -/** - * Stops profiling. - */ -devtools.ProfilerAgent.prototype.stopProfiling = function(modules) -{ - var cmd = new devtools.DebugCommand("profile", { - "modules": modules, - "command": "pause"}); - devtools.DebuggerAgent.sendCommand_(cmd); - RemoteDebuggerAgent.processDebugCommands(); -}; - - -/** - * Handles current profiler status. - * @param {number} modules List of active (started) modules. - */ -devtools.ProfilerAgent.prototype._didGetActiveProfilerModules = function(modules) -{ - var profModules = devtools.ProfilerAgent.ProfilerModules; - var profModuleNone = profModules.PROFILER_MODULE_NONE; - if (this._forceGetLogLines || (modules !== profModuleNone && this._activeProfilerModules === profModuleNone)) { - this._forceGetLogLines = false; - // Start to query log data. - this._getNextLogLines(true); - } - this._activeProfilerModules = modules; - // Update buttons. - WebInspector.setRecordingProfile(modules & profModules.PROFILER_MODULE_CPU); -}; - - -/** - * Handles a portion of a profiler log retrieved by getLogLines call. - * @param {number} pos Current position in log. - * @param {string} log A portion of profiler log. - */ -devtools.ProfilerAgent.prototype._didGetLogLines = function(pos, log) -{ - this._logPosition = pos; - if (log.length > 0) - this._profilerProcessor.processLogChunk(log); - else { - // Allow re-reading from the last position. - this._lastRequestedLogPosition = this._logPosition - 1; - if (this._activeProfilerModules === devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE) - // No new data and profiling is stopped---suspend log reading. - return; - } - this._getNextLogLines(); -}; diff --git a/WebKit/chromium/src/js/ProfilerProcessor.js b/WebKit/chromium/src/js/ProfilerProcessor.js deleted file mode 100644 index f678d2c..0000000 --- a/WebKit/chromium/src/js/ProfilerProcessor.js +++ /dev/null @@ -1,543 +0,0 @@ -/* - * Copyright (C) 2010 Google 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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. - */ - -/** - * @fileoverview Profiler processor is used to process log file produced - * by V8 and produce an internal profile representation which is used - * for building profile views in "Profiles" tab. - */ - - -/** - * Creates a Profile View builder object compatible with WebKit Profiler UI. - * - * @param {number} samplingRate Number of ms between profiler ticks. - * @constructor - */ -devtools.profiler.WebKitViewBuilder = function(samplingRate) -{ - devtools.profiler.ViewBuilder.call(this, samplingRate); -}; -devtools.profiler.WebKitViewBuilder.prototype.__proto__ = devtools.profiler.ViewBuilder.prototype; - - -/** - * @override - */ -devtools.profiler.WebKitViewBuilder.prototype.createViewNode = function(funcName, totalTime, selfTime, head) -{ - return new devtools.profiler.WebKitViewNode(funcName, totalTime, selfTime, head); -}; - - -/** - * Constructs a Profile View node object for displaying in WebKit Profiler UI. - * - * @param {string} internalFuncName A fully qualified function name. - * @param {number} totalTime Amount of time that application spent in the - * corresponding function and its descendants (not that depending on - * profile they can be either callees or callers.) - * @param {number} selfTime Amount of time that application spent in the - * corresponding function only. - * @param {devtools.profiler.ProfileView.Node} head Profile view head. - * @constructor - */ -devtools.profiler.WebKitViewNode = function(internalFuncName, totalTime, selfTime, head) -{ - devtools.profiler.ProfileView.Node.call(this, internalFuncName, totalTime, selfTime, head); - this.initFuncInfo_(); - this.callUID = internalFuncName; -}; -devtools.profiler.WebKitViewNode.prototype.__proto__ = devtools.profiler.ProfileView.Node.prototype; - - -/** - * RegEx for stripping V8's prefixes of compiled functions. - */ -devtools.profiler.WebKitViewNode.FUNC_NAME_STRIP_RE = /^(?:LazyCompile|Function|Callback): (.*)$/; - - -/** - * RegEx for extracting script source URL and line number. - */ -devtools.profiler.WebKitViewNode.FUNC_NAME_PARSE_RE = /^((?:get | set )?[^ ]+) (.*):(\d+)( \{\d+\})?$/; - - -/** - * Inits "functionName", "url", and "lineNumber" fields using "internalFuncName" - * field. - * @private - */ -devtools.profiler.WebKitViewNode.prototype.initFuncInfo_ = function() -{ - var nodeAlias = devtools.profiler.WebKitViewNode; - this.functionName = this.internalFuncName; - - var strippedName = nodeAlias.FUNC_NAME_STRIP_RE.exec(this.functionName); - if (strippedName) - this.functionName = strippedName[1]; - - var parsedName = nodeAlias.FUNC_NAME_PARSE_RE.exec(this.functionName); - if (parsedName) { - this.functionName = parsedName[1]; - if (parsedName[4]) - this.functionName += parsedName[4]; - this.url = parsedName[2]; - this.lineNumber = parsedName[3]; - } else { - this.url = ''; - this.lineNumber = 0; - } -}; - - -/** - * Ancestor of a profile object that leaves out only JS-related functions. - * @constructor - */ -devtools.profiler.JsProfile = function() -{ - devtools.profiler.Profile.call(this); -}; -devtools.profiler.JsProfile.prototype.__proto__ = devtools.profiler.Profile.prototype; - - -/** - * RegExp that leaves only non-native JS functions. - * @type {RegExp} - */ -devtools.profiler.JsProfile.JS_NON_NATIVE_RE = new RegExp( - "^" + - "(?:Callback:)|" + - "(?:Script: (?!native))|" + - "(?:(?:LazyCompile|Function): [^ ]*(?: (?!native )[^ ]+:\\d+)?$)"); - - -/** - * @override - */ -devtools.profiler.JsProfile.prototype.skipThisFunction = function(name) -{ - return !devtools.profiler.JsProfile.JS_NON_NATIVE_RE.test(name); -}; - - -/** - * Profiler processor. Consumes profiler log and builds profile views. - * FIXME: change field naming style to use trailing underscore. - * - * @param {function(devtools.profiler.ProfileView)} newProfileCallback Callback - * that receives a new processed profile. - * @constructor - */ -devtools.profiler.Processor = function() -{ - var dispatches = { - "code-creation": { - parsers: [null, this.createAddressParser("code"), parseInt, null], - processor: this.processCodeCreation_, backrefs: true, - needsProfile: true }, - "code-move": { parsers: [this.createAddressParser("code"), - this.createAddressParser("code-move-to")], - processor: this.processCodeMove_, backrefs: true, - needsProfile: true }, - "code-delete": { parsers: [this.createAddressParser("code")], - processor: this.processCodeDelete_, backrefs: true, - needsProfile: true }, - "function-creation": { parsers: [this.createAddressParser("code"), - this.createAddressParser("function-obj")], - processor: this.processFunctionCreation_, backrefs: true }, - "function-move": { parsers: [this.createAddressParser("code"), - this.createAddressParser("code-move-to")], - processor: this.processFunctionMove_, backrefs: true }, - "function-delete": { parsers: [this.createAddressParser("code")], - processor: this.processFunctionDelete_, backrefs: true }, - "tick": { parsers: [this.createAddressParser("code"), - this.createAddressParser("stack"), parseInt, "var-args"], - processor: this.processTick_, backrefs: true, needProfile: true }, - "profiler": { parsers: [null, "var-args"], - processor: this.processProfiler_, needsProfile: false }, - "heap-sample-begin": { parsers: [null, null, parseInt], - processor: this.processHeapSampleBegin_ }, - "heap-sample-stats": { parsers: [null, null, parseInt, parseInt], - processor: this.processHeapSampleStats_ }, - "heap-sample-item": { parsers: [null, parseInt, parseInt], - processor: this.processHeapSampleItem_ }, - "heap-js-cons-item": { parsers: [null, parseInt, parseInt], - processor: this.processHeapJsConsItem_ }, - "heap-js-ret-item": { parsers: [null, "var-args"], - processor: this.processHeapJsRetItem_ }, - "heap-sample-end": { parsers: [null, null], - processor: this.processHeapSampleEnd_ }, - // Not used in DevTools Profiler. - "shared-library": null, - // Obsolete row types. - "code-allocate": null, - "begin-code-region": null, - "end-code-region": null}; - - if (devtools.profiler.Profile.VERSION === 2) { - dispatches["tick"] = { parsers: [this.createAddressParser("code"), - this.createAddressParser("stack"), - this.createAddressParser("func"), parseInt, "var-args"], - processor: this.processTickV2_, backrefs: true }; - } - - devtools.profiler.LogReader.call(this, dispatches); - - /** - * Callback that is called when a new profile is encountered in the log. - * @type {function()} - */ - this.startedProfileProcessing_ = null; - - /** - * Callback that is called periodically to display processing status. - * @type {function()} - */ - this.profileProcessingStatus_ = null; - - /** - * Callback that is called when a profile has been processed and is ready - * to be shown. - * @type {function(devtools.profiler.ProfileView)} - */ - this.finishedProfileProcessing_ = null; - - /** - * The current profile. - * @type {devtools.profiler.JsProfile} - */ - this.currentProfile_ = null; - - /** - * Builder of profile views. Created during "profiler,begin" event processing. - * @type {devtools.profiler.WebKitViewBuilder} - */ - this.viewBuilder_ = null; - - /** - * Next profile id. - * @type {number} - */ - this.profileId_ = 1; - - /** - * Counter for processed ticks. - * @type {number} - */ - this.ticksCount_ = 0; - - /** - * Interval id for updating processing status. - * @type {number} - */ - this.processingInterval_ = null; - - /** - * The current heap snapshot. - * @type {string} - */ - this.currentHeapSnapshot_ = null; - - /** - * Next heap snapshot id. - * @type {number} - */ - this.heapSnapshotId_ = 1; -}; -devtools.profiler.Processor.prototype.__proto__ = devtools.profiler.LogReader.prototype; - - -/** - * @override - */ -devtools.profiler.Processor.prototype.printError = function(str) -{ - debugPrint(str); -}; - - -/** - * @override - */ -devtools.profiler.Processor.prototype.skipDispatch = function(dispatch) -{ - return dispatch.needsProfile && this.currentProfile_ === null; -}; - - -/** - * Sets profile processing callbacks. - * - * @param {function()} started Started processing callback. - * @param {function(devtools.profiler.ProfileView)} finished Finished - * processing callback. - */ -devtools.profiler.Processor.prototype.setCallbacks = function(started, processing, finished) -{ - this.startedProfileProcessing_ = started; - this.profileProcessingStatus_ = processing; - this.finishedProfileProcessing_ = finished; -}; - - -/** - * An address for the fake "(program)" entry. WebKit's visualisation - * has assumptions on how the top of the call tree should look like, - * and we need to add a fake entry as the topmost function. This - * address is chosen because it's the end address of the first memory - * page, which is never used for code or data, but only as a guard - * page for catching AV errors. - * - * @type {number} - */ -devtools.profiler.Processor.PROGRAM_ENTRY = 0xffff; -/** - * @type {string} - */ -devtools.profiler.Processor.PROGRAM_ENTRY_STR = "0xffff"; - - -/** - * Sets new profile callback. - * @param {function(devtools.profiler.ProfileView)} callback Callback function. - */ -devtools.profiler.Processor.prototype.setNewProfileCallback = function(callback) -{ - this.newProfileCallback_ = callback; -}; - - -devtools.profiler.Processor.prototype.processProfiler_ = function(state, params) -{ - switch (state) { - case "resume": - if (this.currentProfile_ === null) { - this.currentProfile_ = new devtools.profiler.JsProfile(); - // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY - this.currentProfile_.addCode("Function", "(program)", devtools.profiler.Processor.PROGRAM_ENTRY, 1); - if (this.startedProfileProcessing_) - this.startedProfileProcessing_(); - this.ticksCount_ = 0; - var self = this; - if (this.profileProcessingStatus_) { - this.processingInterval_ = window.setInterval( - function() { self.profileProcessingStatus_(self.ticksCount_); }, - 1000); - } - } - break; - case "pause": - if (this.currentProfile_ !== null) { - window.clearInterval(this.processingInterval_); - this.processingInterval_ = null; - if (this.finishedProfileProcessing_) - this.finishedProfileProcessing_(this.createProfileForView()); - this.currentProfile_ = null; - } - break; - case "begin": - var samplingRate = NaN; - if (params.length > 0) - samplingRate = parseInt(params[0]); - if (isNaN(samplingRate)) - samplingRate = 1; - this.viewBuilder_ = new devtools.profiler.WebKitViewBuilder(samplingRate); - break; - // These events are valid but aren't used. - case "compression": - case "end": break; - default: - throw new Error("unknown profiler state: " + state); - } -}; - - -devtools.profiler.Processor.prototype.processCodeCreation_ = function(type, start, size, name) -{ - this.currentProfile_.addCode(this.expandAlias(type), name, start, size); -}; - - -devtools.profiler.Processor.prototype.processCodeMove_ = function(from, to) -{ - this.currentProfile_.moveCode(from, to); -}; - - -devtools.profiler.Processor.prototype.processCodeDelete_ = function(start) -{ - this.currentProfile_.deleteCode(start); -}; - - -devtools.profiler.Processor.prototype.processFunctionCreation_ = function(functionAddr, codeAddr) -{ - this.currentProfile_.addCodeAlias(functionAddr, codeAddr); -}; - - -devtools.profiler.Processor.prototype.processFunctionMove_ = function(from, to) -{ - this.currentProfile_.safeMoveDynamicCode(from, to); -}; - - -devtools.profiler.Processor.prototype.processFunctionDelete_ = function(start) -{ - this.currentProfile_.safeDeleteDynamicCode(start); -}; - - -// TODO(mnaganov): Remove after next V8 roll. -devtools.profiler.Processor.prototype.processTick_ = function(pc, sp, vmState, stack) -{ - // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY - stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR); - this.currentProfile_.recordTick(this.processStack(pc, stack)); - this.ticksCount_++; -}; - - -devtools.profiler.Processor.prototype.processTickV2_ = function(pc, sp, func, vmState, stack) -{ - // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY - stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR); - - - if (func) { - var funcEntry = this.currentProfile_.findEntry(func); - if (!funcEntry || !funcEntry.isJSFunction || !funcEntry.isJSFunction()) - func = 0; - else { - var currEntry = this.currentProfile_.findEntry(pc); - if (!currEntry || !currEntry.isJSFunction || currEntry.isJSFunction()) { - func = 0; - } - } - } - - this.currentProfile_.recordTick(this.processStack(pc, func, stack)); - this.ticksCount_++; -}; - - -devtools.profiler.Processor.prototype.processHeapSampleBegin_ = function(space, state, ticks) -{ - if (space !== "Heap") return; - this.currentHeapSnapshot_ = { - number: this.heapSnapshotId_++, - entries: {}, - clusters: {}, - lowlevels: {}, - ticks: ticks - }; -}; - - -devtools.profiler.Processor.prototype.processHeapSampleStats_ = function(space, state, capacity, used) -{ - if (space !== "Heap") return; -}; - - -devtools.profiler.Processor.prototype.processHeapSampleItem_ = function(item, number, size) -{ - if (!this.currentHeapSnapshot_) return; - this.currentHeapSnapshot_.lowlevels[item] = { - type: item, count: number, size: size - }; -}; - - -devtools.profiler.Processor.prototype.processHeapJsConsItem_ = function(item, number, size) -{ - if (!this.currentHeapSnapshot_) return; - this.currentHeapSnapshot_.entries[item] = { - cons: item, count: number, size: size, retainers: {} - }; -}; - - -devtools.profiler.Processor.prototype.processHeapJsRetItem_ = function(item, retainersArray) -{ - if (!this.currentHeapSnapshot_) return; - var rawRetainers = {}; - for (var i = 0, n = retainersArray.length; i < n; ++i) { - var entry = retainersArray[i].split(";"); - rawRetainers[entry[0]] = parseInt(entry[1], 10); - } - - function mergeRetainers(entry) { - for (var rawRetainer in rawRetainers) { - var consName = rawRetainer.indexOf(":") !== -1 ? rawRetainer.split(":")[0] : rawRetainer; - if (!(consName in entry.retainers)) - entry.retainers[consName] = { cons: consName, count: 0, clusters: {} }; - var retainer = entry.retainers[consName]; - retainer.count += rawRetainers[rawRetainer]; - if (consName !== rawRetainer) - retainer.clusters[rawRetainer] = true; - } - } - - if (item.indexOf(":") !== -1) { - // Array, Function, or Object instances cluster case. - if (!(item in this.currentHeapSnapshot_.clusters)) { - this.currentHeapSnapshot_.clusters[item] = { - cons: item, retainers: {} - }; - } - mergeRetainers(this.currentHeapSnapshot_.clusters[item]); - item = item.split(":")[0]; - } - mergeRetainers(this.currentHeapSnapshot_.entries[item]); -}; - - -devtools.profiler.Processor.prototype.processHeapSampleEnd_ = function(space, state) -{ - if (space !== "Heap") return; - var snapshot = this.currentHeapSnapshot_; - this.currentHeapSnapshot_ = null; - WebInspector.panels.profiles.addSnapshot(snapshot); -}; - - -/** - * Creates a profile for further displaying in ProfileView. - */ -devtools.profiler.Processor.prototype.createProfileForView = function() -{ - var profile = this.viewBuilder_.buildView(this.currentProfile_.getTopDownProfile()); - profile.uid = this.profileId_++; - profile.title = UserInitiatedProfileName + "." + profile.uid; - return profile; -}; diff --git a/WebKit/chromium/src/js/Tests.js b/WebKit/chromium/src/js/Tests.js index fa0c99f..2b264ee 100644 --- a/WebKit/chromium/src/js/Tests.js +++ b/WebKit/chromium/src/js/Tests.js @@ -219,40 +219,6 @@ TestSuite.prototype.addSniffer = function(receiver, methodName, override, opt_st /** - * Tests that the real injected host is present in the context. - */ -TestSuite.prototype.testHostIsPresent = function() -{ - this.assertTrue(typeof InspectorFrontendHost === "object" && !InspectorFrontendHost.isStub); -}; - - -/** - * Tests elements tree has an "HTML" root. - */ -TestSuite.prototype.testElementsTreeRoot = function() -{ - var doc = WebInspector.domAgent.document; - this.assertEquals("HTML", doc.documentElement.nodeName); - this.assertTrue(doc.documentElement.hasChildNodes()); -}; - - -/** - * Tests that main resource is present in the system and that it is - * the only resource. - */ -TestSuite.prototype.testMainResource = function() -{ - var tokens = []; - var resources = WebInspector.resources; - for (var id in resources) - tokens.push(resources[id].lastPathComponent); - this.assertEquals("simple_page.html", tokens.join(",")); -}; - - -/** * Tests that resources tab is enabled when corresponding item is selected. */ TestSuite.prototype.testEnableResourcesTab = function() @@ -261,10 +227,10 @@ TestSuite.prototype.testEnableResourcesTab = function() var test = this; this.addSniffer(WebInspector, "updateResource", - function(identifier, payload) { + function(payload) { test.assertEquals("simple_page.html", payload.lastPathComponent); WebInspector.panels.resources.refresh(); - WebInspector.panels.resources.revealAndSelectItem(WebInspector.resources[identifier]); + WebInspector.panels.resources.revealAndSelectItem(WebInspector.resources[payload.id]); test.releaseControl(); }); @@ -279,185 +245,89 @@ TestSuite.prototype.testEnableResourcesTab = function() /** - * Tests that correct content length is reported for resources. - */ -TestSuite.prototype.testResourceContentLength = function() -{ - this.showPanel("resources"); - var test = this; - - var png = false; - var html = false; - this.addSniffer(WebInspector, "updateResource", - function(identifier, payload) { - if (!payload.didLengthChange) - return; - var resource = WebInspector.resources[identifier]; - if (!resource || !resource.url) - return; - if (resource.url.search("image.html$") !== -1) { - var expectedLength = 87; - test.assertTrue( - resource.contentLength <= expectedLength, - "image.html content length is greater thatn expected."); - if (expectedLength === resource.contentLength) - html = true; - } else if (resource.url.search("image.png") !== -1) { - var expectedLength = 257796; - test.assertTrue( - resource.contentLength <= expectedLength, - "image.png content length is greater than expected."); - if (expectedLength === resource.contentLength) - png = true; - } - if (html && png) { - // Wait 1 second before releasing control to check that the content - // lengths are not updated anymore. - setTimeout(function() { - test.releaseControl(); - }, 1000); - } - }, true); - - // Make sure resource tracking is on. - WebInspector.panels.resources._enableResourceTracking(); - // Reload inspected page to update all resources. - test.evaluateInConsole_( - "window.location.reload(true);", - function(resultText) { - test.assertEquals("undefined", resultText, "Unexpected result of reload()."); - }); - - // We now have some time to report results to controller. - this.takeControl(); -}; - - -/** - * Tests resource headers. + * Tests that profiler works. */ -TestSuite.prototype.testResourceHeaders = function() +TestSuite.prototype.testProfilerTab = function() { - this.showPanel("resources"); + this.showPanel("profiles"); + var panel = WebInspector.panels.profiles; var test = this; - var responseOk = false; - var timingOk = false; - - this.addSniffer(WebInspector, "updateResource", - function(identifier, payload) { - var resource = this.resources[identifier]; - if (!resource || resource.mainResource) { - // We are only interested in secondary resources in this test. - return; - } - - var requestHeaders = JSON.stringify(resource.requestHeaders); - test.assertContains(requestHeaders, "Accept"); + function findDisplayedNode() { + var node = panel.visibleView.profileDataGridTree.children[0]; + if (!node) { + // Profile hadn't been queried yet, re-schedule. + window.setTimeout(findDisplayedNode, 100); + return; + } - if (payload.didResponseChange) { - var responseHeaders = JSON.stringify(resource.responseHeaders); - test.assertContains(responseHeaders, "Content-type"); - test.assertContains(responseHeaders, "Content-Length"); - test.assertTrue(typeof resource.responseReceivedTime !== "undefined"); - responseOk = true; - } + // Iterate over displayed functions and search for a function + // that is called "fib" or "eternal_fib". If found, this will mean + // that we actually have profiled page's code. + while (node) { + if (node.functionName.indexOf("fib") !== -1) + test.releaseControl(); + node = node.traverseNextNode(true, null, true); + } - if (payload.didTimingChange) { - test.assertTrue(typeof resource.startTime !== "undefined"); - timingOk = true; - } + test.fail(); + } - if (payload.didCompletionChange) { - test.assertTrue(responseOk); - test.assertTrue(timingOk); - test.assertTrue(typeof resource.endTime !== "undefined"); - test.releaseControl(); - } - }, true); + function findVisibleView() { + if (!panel.visibleView) { + setTimeout(findVisibleView, 0); + return; + } + setTimeout(findDisplayedNode, 0); + } - WebInspector.panels.resources._enableResourceTracking(); + findVisibleView(); this.takeControl(); }; /** - * Tests the mime type of a cached (HTTP 304) resource. + * Tests that heap profiler works. */ -TestSuite.prototype.testCachedResourceMimeType = function() +TestSuite.prototype.testHeapProfiler = function() { - this.showPanel("resources"); + this.showPanel("profiles"); + var panel = WebInspector.panels.profiles; var test = this; - var hasReloaded = false; - this.addSniffer(WebInspector, "updateResource", - function(identifier, payload) { - var resource = this.resources[identifier]; - if (!resource || resource.mainResource) { - // We are only interested in secondary resources in this test. - return; - } + function findDisplayedNode() { + var node = panel.visibleView.dataGrid.children[0]; + if (!node) { + // Profile hadn't been queried yet, re-schedule. + window.setTimeout(findDisplayedNode, 100); + return; + } - if (payload.didResponseChange) { - // Test server uses a default mime type for JavaScript files. - test.assertEquals("text/html", payload.mimeType); - if (!hasReloaded) { - hasReloaded = true; - // Reload inspected page to update all resources. - test.evaluateInConsole_("window.location.reload(true);", function() {}); - } else - test.releaseControl(); + // Iterate over displayed functions and find node called "A" + // If found, this will mean that we actually have taken heap snapshot. + while (node) { + if (node.constructorName.indexOf("A") !== -1) { + test.releaseControl(); + return; } + node = node.traverseNextNode(false, null, true); + } - }, true); - - WebInspector.panels.resources._enableResourceTracking(); - this.takeControl(); -}; - - -/** - * Tests that profiler works. - */ -TestSuite.prototype.testProfilerTab = function() -{ - this.showPanel("profiles"); - - var test = this; - this.addSniffer(WebInspector.panels.profiles, "addProfileHeader", - function(typeOrProfile, profile) { - if (!profile) - profile = typeOrProfile; - var panel = WebInspector.panels.profiles; - panel.showProfile(profile); - var node = panel.visibleView.profileDataGridTree.children[0]; - // Iterate over displayed functions and search for a function - // that is called "fib" or "eternal_fib". If found, it will mean - // that we actually have profiled page's code. - while (node) { - if (node.functionName.indexOf("fib") !== -1) - test.releaseControl(); - node = node.traverseNextNode(true, null, true); - } + test.fail(); + } - test.fail(); - }); - var ticksCount = 0; - var tickRecord = "\nt,"; - this.addSniffer(RemoteProfilerAgent, "didGetLogLines", - function(posIgnored, log) { - var pos = 0; - while ((pos = log.indexOf(tickRecord, pos)) !== -1) { - pos += tickRecord.length; - ticksCount++; - } - if (ticksCount > 100) - InspectorBackend.stopProfiling(); - }, true); + function findVisibleView() { + if (!panel.visibleView) { + setTimeout(findVisibleView, 0); + return; + } + setTimeout(findDisplayedNode, 0); + } - InspectorBackend.startProfiling(); + WebInspector.HeapSnapshotProfileType.prototype.buttonClicked(); + findVisibleView(); this.takeControl(); }; @@ -470,7 +340,7 @@ TestSuite.prototype.testShowScriptsTab = function() this.showPanel("scripts"); var test = this; // There should be at least main page script. - this._waitUntilScriptsAreParsed(["debugger_test_page.html$"], + this._waitUntilScriptsAreParsed(["debugger_test_page.html"], function() { test.releaseControl(); }); @@ -489,31 +359,19 @@ TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh = function() var test = this; this.assertEquals(WebInspector.panels.elements, WebInspector.currentPanel, "Elements panel should be current one."); - this.addSniffer(devtools.DebuggerAgent.prototype, "reset", waitUntilScriptIsParsed); + this.addSniffer(WebInspector.panels.scripts, "reset", waitUntilScriptIsParsed); // Reload inspected page. It will reset the debugger agent. test.evaluateInConsole_( "window.location.reload(true);", - function(resultText) { - test.assertEquals("undefined", resultText, "Unexpected result of reload()."); - }); + function(resultText) {}); function waitUntilScriptIsParsed() { - var parsed = devtools.tools.getDebuggerAgent().parsedScripts_; - for (var id in parsed) { - var url = parsed[id].getUrl(); - if (url && url.search("debugger_test_page.html$") !== -1) { - checkScriptsPanel(); - return; - } - } - test.addSniffer(devtools.DebuggerAgent.prototype, "addScriptInfo_", waitUntilScriptIsParsed); - } - - function checkScriptsPanel() { test.showPanel("scripts"); - test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html$"]), "Inspected script not found in the scripts list"); - test.releaseControl(); + test._waitUntilScriptsAreParsed(["debugger_test_page.html"], + function() { + test.releaseControl(); + }); } // Wait until all scripts are added to the debugger. @@ -530,7 +388,7 @@ TestSuite.prototype.testContentScriptIsPresent = function() var test = this; test._waitUntilScriptsAreParsed( - ["page_with_content_script.html$", "simple_content_script.js$"], + ["page_with_content_script.html", "simple_content_script.js"], function() { test.releaseControl(); }); @@ -568,7 +426,7 @@ TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function() function checkScriptsPanel() { test.assertTrue(!!WebInspector.panels.scripts.visibleView, "No visible script view."); - test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html$"]), "Some scripts are missing."); + test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]), "Some scripts are missing."); checkNoDuplicates(); test.releaseControl(); } @@ -584,7 +442,7 @@ TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function() } test._waitUntilScriptsAreParsed( - ["debugger_test_page.html$"], + ["debugger_test_page.html"], function() { checkNoDuplicates(); setTimeout(switchToElementsTab, 0); @@ -596,69 +454,6 @@ TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function() }; -/** - * Tests that a breakpoint can be set. - */ -TestSuite.prototype.testSetBreakpoint = function() -{ - var test = this; - this.showPanel("scripts"); - - var breakpointLine = 12; - - this._waitUntilScriptsAreParsed(["debugger_test_page.html"], - function() { - test.showMainPageScriptSource_( - "debugger_test_page.html", - function(view, url) { - view._addBreakpoint(breakpointLine); - // Force v8 execution. - RemoteDebuggerAgent.processDebugCommands(); - test.waitForSetBreakpointResponse_(url, breakpointLine, - function() { - test.releaseControl(); - }); - }); - }); - - this.takeControl(); -}; - - -/** - * Tests that pause on exception works. - */ -TestSuite.prototype.testPauseOnException = function() -{ - this.showPanel("scripts"); - var test = this; - - // TODO(yurys): remove else branch once the states are supported. - if (WebInspector.ScriptsPanel.PauseOnExceptionsState) { - while (WebInspector.currentPanel.pauseOnExceptionButton.state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions) - WebInspector.currentPanel.pauseOnExceptionButton.element.click(); - } else { - // Make sure pause on exceptions is on. - if (!WebInspector.currentPanel.pauseOnExceptionButton.toggled) - WebInspector.currentPanel.pauseOnExceptionButton.element.click(); - } - - this._executeCodeWhenScriptsAreParsed("handleClick()", ["pause_on_exception.html$"]); - - this._waitForScriptPause( - { - functionsOnStack: ["throwAnException", "handleClick", "(anonymous function)"], - lineNumber: 6, - lineText: " return unknown_var;" - }, - function() { - test.releaseControl(); - }); - - this.takeControl(); -}; - - // Tests that debugger works correctly if pause event occurs when DevTools // frontend is being loaded. TestSuite.prototype.testPauseWhenLoadingDevTools = function() @@ -729,7 +524,7 @@ TestSuite.prototype.testPauseWhenScriptIsRunning = function() test._waitForScriptPause( { - functionsOnStack: ["handleClick", "(anonymous function)"], + functionsOnStack: ["handleClick", ""], lineNumber: 5, lineText: " while(true) {" }, @@ -818,7 +613,7 @@ TestSuite.prototype.showMainPageScriptSource_ = function(scriptName, callback) */ TestSuite.prototype.evaluateInConsole_ = function(code, callback) { - WebInspector.console.visible = true; + WebInspector.showConsole(); WebInspector.console.prompt.text = code; WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter")); @@ -829,83 +624,6 @@ TestSuite.prototype.evaluateInConsole_ = function(code, callback) }; -/* - * Waits for "setbreakpoint" response, checks that corresponding breakpoint - * was successfully set and invokes the callback if it was. - * @param {string} scriptUrl - * @param {number} breakpointLine - * @param {function()} callback - */ -TestSuite.prototype.waitForSetBreakpointResponse_ = function(scriptUrl, breakpointLine, callback) -{ - var test = this; - test.addSniffer( - devtools.DebuggerAgent.prototype, - "handleSetBreakpointResponse_", - function(msg) { - var bps = this.urlToBreakpoints_[scriptUrl]; - test.assertTrue(!!bps, "No breakpoints for line " + breakpointLine); - var line = devtools.DebuggerAgent.webkitToV8LineNumber_(breakpointLine); - test.assertTrue(!!bps[line].getV8Id(), "Breakpoint id was not assigned."); - callback(); - }); -}; - - -/** - * Tests eval on call frame. - */ -TestSuite.prototype.testEvalOnCallFrame = function() -{ - this.showPanel("scripts"); - - var breakpointLine = 16; - - var test = this; - this.addSniffer(devtools.DebuggerAgent.prototype, "handleScriptsResponse_", - function(msg) { - test.showMainPageScriptSource_( - "debugger_test_page.html", - function(view, url) { - view._addBreakpoint(breakpointLine); - // Force v8 execution. - RemoteDebuggerAgent.processDebugCommands(); - test.waitForSetBreakpointResponse_(url, breakpointLine, setBreakpointCallback); - }); - }); - - function setBreakpointCallback() { - // Since breakpoints are ignored in evals' calculate() function is - // execute after zero-timeout so that the breakpoint is hit. - test.evaluateInConsole_( - 'setTimeout("calculate(123)" , 0)', - function(resultText) { - test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText); - waitForBreakpointHit(); - }); - } - - function waitForBreakpointHit() { - test.addSniffer( - devtools.DebuggerAgent.prototype, - "handleBacktraceResponse_", - function(msg) { - test.assertEquals(2, this.callFrames_.length, "Unexpected stack depth on the breakpoint. " + JSON.stringify(msg)); - test.assertEquals("calculate", this.callFrames_[0].functionName, "Unexpected top frame function."); - // Evaluate "e+1" where "e" is an argument of "calculate" function. - test.evaluateInConsole_( - "e+1", - function(resultText) { - test.assertEquals("124", resultText, 'Unexpected "e+1" value.'); - test.releaseControl(); - }); - }); - } - - this.takeControl(); -}; - - /** * Tests that console auto completion works when script execution is paused. */ @@ -913,19 +631,23 @@ TestSuite.prototype.testCompletionOnPause = function() { this.showPanel("scripts"); var test = this; - this._executeCodeWhenScriptsAreParsed("handleClick()", ["completion_on_pause.html$"]); + this._executeCodeWhenScriptsAreParsed("handleClick()", ["completion_on_pause.html"]); this._waitForScriptPause( { - functionsOnStack: ["innerFunction", "handleClick", "(anonymous function)"], + functionsOnStack: ["innerFunction", "handleClick", ""], lineNumber: 9, lineText: " debugger;" }, showConsole); function showConsole() { - test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion); - WebInspector.showConsole(); + if (WebInspector.currentFocusElement === WebInspector.console.promptElement) + testLocalsCompletion(); + else { + test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion); + WebInspector.showConsole(); + } } function testLocalsCompletion() { @@ -959,65 +681,6 @@ TestSuite.prototype.testCompletionOnPause = function() /** - * Tests that inspected page doesn't hang on reload if it contains a syntax - * error and DevTools window is open. - */ -TestSuite.prototype.testAutoContinueOnSyntaxError = function() -{ - this.showPanel("scripts"); - var test = this; - - function checkScriptsList() { - var scriptSelect = document.getElementById("scripts-files"); - var options = scriptSelect.options; - // There should be only console API source (see - // InjectedScript._ensureCommandLineAPIInstalled) since the page script - // contains a syntax error. - for (var i = 0 ; i < options.length; i++) { - if (options[i].text.search("script_syntax_error.html$") !== -1) - test.fail("Script with syntax error should not be in the list of parsed scripts."); - } - } - - this.addSniffer(devtools.DebuggerAgent.prototype, "handleScriptsResponse_", - function(msg) { - checkScriptsList(); - - // Reload inspected page. - test.evaluateInConsole_( - "window.location.reload(true);", - function(resultText) { - test.assertEquals("undefined", resultText, "Unexpected result of reload()."); - waitForExceptionEvent(); - }); - }); - - function waitForExceptionEvent() { - var exceptionCount = 0; - test.addSniffer( - devtools.DebuggerAgent.prototype, - "handleExceptionEvent_", - function(msg) { - exceptionCount++; - test.assertEquals(1, exceptionCount, "Too many exceptions."); - test.assertEquals(undefined, msg.getBody().script, "Unexpected exception: " + JSON.stringify(msg)); - test.releaseControl(); - }); - - // Check that the script is not paused on parse error. - test.addSniffer( - WebInspector, - "pausedScript", - function(callFrames) { - test.fail("Script execution should not pause on syntax error."); - }); - } - - this.takeControl(); -}; - - -/** * Checks current execution line against expectations. * @param {WebInspector.SourceFrame} sourceFrame * @param {number} lineNumber Expected line number @@ -1069,7 +732,8 @@ TestSuite.prototype._waitForScriptPause = function(expectations, callback) test.addSniffer( WebInspector, "pausedScript", - function(callFrames) { + function(details) { + var callFrames = details.callFrames; var functionsOnStack = []; for (var i = 0; i < callFrames.length; i++) functionsOnStack.push(callFrames[i].functionName); @@ -1109,25 +773,6 @@ TestSuite.prototype._checkSourceFrameWhenLoaded = function(expectations, callbac /** - * Performs sequence of steps. - * @param {Array.<Object|Function>} Array [expectations1,action1,expectations2, - * action2,...,actionN]. - */ -TestSuite.prototype._performSteps = function(actions) -{ - var test = this; - var i = 0; - function doNextAction() { - if (i > 0) - actions[i++](); - if (i < actions.length - 1) - test._waitForScriptPause(actions[i++], doNextAction); - } - doNextAction(); -}; - - -/** * Waits until all the scripts are parsed and asynchronously executes the code * in the inspected page. */ @@ -1141,7 +786,7 @@ TestSuite.prototype._executeCodeWhenScriptsAreParsed = function(code, expectedSc test.evaluateInConsole_( 'setTimeout("' + code + '" , 0)', function(resultText) { - test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText); + test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText + ". Code: " + code); }); } @@ -1168,355 +813,6 @@ TestSuite.prototype._waitUntilScriptsAreParsed = function(expectedScripts, callb /** - * Waits until all debugger scripts are parsed and executes "a()" in the - * inspected page. - */ -TestSuite.prototype._executeFunctionForStepTest = function() -{ - this._executeCodeWhenScriptsAreParsed("a()", ["debugger_step.html$", "debugger_step.js$"]); -}; - - -/** - * Tests step over in the debugger. - */ -TestSuite.prototype.testStepOver = function() -{ - this.showPanel("scripts"); - var test = this; - - this._executeFunctionForStepTest(); - - this._performSteps([ - { - functionsOnStack: ["d","a","(anonymous function)"], - lineNumber: 3, - lineText: " debugger;" - }, - function() { - document.getElementById("scripts-step-over").click(); - }, - { - functionsOnStack: ["d","a","(anonymous function)"], - lineNumber: 5, - lineText: " var y = fact(10);" - }, - function() { - document.getElementById("scripts-step-over").click(); - }, - { - functionsOnStack: ["d","a","(anonymous function)"], - lineNumber: 6, - lineText: " return y;" - }, - function() { - test.releaseControl(); - } - ]); - - test.takeControl(); -}; - - -/** - * Tests step out in the debugger. - */ -TestSuite.prototype.testStepOut = function() -{ - this.showPanel("scripts"); - var test = this; - - this._executeFunctionForStepTest(); - - this._performSteps([ - { - functionsOnStack: ["d","a","(anonymous function)"], - lineNumber: 3, - lineText: " debugger;" - }, - function() { - document.getElementById("scripts-step-out").click(); - }, - { - functionsOnStack: ["a","(anonymous function)"], - lineNumber: 8, - lineText: " printResult(result);" - }, - function() { - test.releaseControl(); - } - ]); - - test.takeControl(); -}; - - -/** - * Tests step in in the debugger. - */ -TestSuite.prototype.testStepIn = function() -{ - this.showPanel("scripts"); - var test = this; - - this._executeFunctionForStepTest(); - - this._performSteps([ - { - functionsOnStack: ["d","a","(anonymous function)"], - lineNumber: 3, - lineText: " debugger;" - }, - function() { - document.getElementById("scripts-step-over").click(); - }, - { - functionsOnStack: ["d","a","(anonymous function)"], - lineNumber: 5, - lineText: " var y = fact(10);" - }, - function() { - document.getElementById("scripts-step-into").click(); - }, - { - functionsOnStack: ["fact","d","a","(anonymous function)"], - lineNumber: 15, - lineText: " return r;" - }, - function() { - test.releaseControl(); - } - ]); - - test.takeControl(); -}; - - -/** - * Gets a XPathResult matching given xpath. - * @param {string} xpath - * @param {number} resultType - * @param {Node} opt_ancestor Context node. If not specified documentElement - * will be used - * @return {XPathResult} Type of returned value is determined by "resultType" parameter - */ - -TestSuite.prototype._evaluateXpath = function(xpath, resultType, opt_ancestor) -{ - if (!opt_ancestor) - opt_ancestor = document.documentElement; - try { - return document.evaluate(xpath, opt_ancestor, null, resultType, null); - } catch(e) { - this.fail('Error in expression: "' + xpath + '".' + e); - } -}; - - -/** - * Gets first Node matching given xpath. - * @param {string} xpath - * @param {Node} opt_ancestor Context node. If not specified documentElement - * will be used - * @return {?Node} - */ -TestSuite.prototype._findNode = function(xpath, opt_ancestor) -{ - var result = this._evaluateXpath(xpath, XPathResult.FIRST_ORDERED_NODE_TYPE, opt_ancestor).singleNodeValue; - this.assertTrue(!!result, "Cannot find node on path: " + xpath); - return result; -}; - - -/** - * Gets a text matching given xpath. - * @param {string} xpath - * @param {Node} opt_ancestor Context node. If not specified documentElement - * will be used - * @return {?string} - */ -TestSuite.prototype._findText = function(xpath, opt_ancestor) -{ - var result = this._evaluateXpath(xpath, XPathResult.STRING_TYPE, opt_ancestor).stringValue; - this.assertTrue(!!result, "Cannot find text on path: " + xpath); - return result; -}; - - -/** - * Gets an iterator over nodes matching given xpath. - * @param {string} xpath - * @param {Node} opt_ancestor Context node. If not specified, documentElement - * will be used - * @return {XPathResult} Iterator over the nodes - */ -TestSuite.prototype._nodeIterator = function(xpath, opt_ancestor) -{ - return this._evaluateXpath(xpath, XPathResult.ORDERED_NODE_ITERATOR_TYPE, opt_ancestor); -}; - - -/** - * Checks the scopeSectionDiv against the expectations. - * @param {Node} scopeSectionDiv The section div - * @param {Object} expectations Expectations dictionary - */ -TestSuite.prototype._checkScopeSectionDiv = function(scopeSectionDiv, expectations) -{ - var scopeTitle = this._findText('./div[@class="header"]/div[@class="title"]/text()', scopeSectionDiv); - this.assertEquals(expectations.title, scopeTitle, "Unexpected scope section title."); - if (!expectations.properties) - return; - this.assertTrue(scopeSectionDiv.hasStyleClass("expanded"), 'Section "' + scopeTitle + '" is collapsed.'); - - var propertyIt = this._nodeIterator("./ol/li", scopeSectionDiv); - var propertyLi; - var foundProps = []; - while (propertyLi = propertyIt.iterateNext()) { - var name = this._findText('./span[@class="name"]/text()', propertyLi); - var value = this._findText('./span[@class="value"]/text()', propertyLi); - this.assertTrue(!!name, 'Invalid variable name: "' + name + '"'); - this.assertTrue(name in expectations.properties, "Unexpected property: " + name); - this.assertEquals(expectations.properties[name], value, 'Unexpected "' + name + '" property value.'); - delete expectations.properties[name]; - foundProps.push(name + " = " + value); - } - - // Check that all expected properties were found. - for (var p in expectations.properties) - this.fail('Property "' + p + '" was not found in scope "' + scopeTitle + '". Found properties: "' + foundProps.join(",") + '"'); -}; - - -/** - * Expands scope sections matching the filter and invokes the callback on - * success. - * @param {function(WebInspector.ObjectPropertiesSection, number):boolean} - * filter - * @param {Function} callback - */ -TestSuite.prototype._expandScopeSections = function(filter, callback) -{ - var sections = WebInspector.currentPanel.sidebarPanes.scopechain.sections; - - var toBeUpdatedCount = 0; - function updateListener() { - --toBeUpdatedCount; - if (toBeUpdatedCount === 0) { - // Report when all scopes are expanded and populated. - callback(); - } - } - - // Global scope is always the last one. - for (var i = 0; i < sections.length - 1; i++) { - var section = sections[i]; - if (!filter(sections, i)) - continue; - ++toBeUpdatedCount; - var populated = section.populated; - - this._hookGetPropertiesCallback(updateListener, - function() { - section.expand(); - if (populated) { - // Make sure "updateProperties" callback will be called at least once - // after it was overridden. - section.update(); - } - }); - } -}; - - -/** - * Tests that scopes can be expanded and contain expected data. - */ -TestSuite.prototype.testExpandScope = function() -{ - this.showPanel("scripts"); - var test = this; - - this._executeCodeWhenScriptsAreParsed("handleClick()", ["debugger_closure.html$"]); - - this._waitForScriptPause( - { - functionsOnStack: ["innerFunction", "handleClick", "(anonymous function)"], - lineNumber: 8, - lineText: " debugger;" - }, - expandAllSectionsExceptGlobal); - - // Expanding Global scope takes for too long so we skeep it. - function expandAllSectionsExceptGlobal() { - test._expandScopeSections(function(sections, i) { - return i < sections.length - 1; - }, - examineScopes /* When all scopes are expanded and populated check them. */); - } - - // Check scope sections contents. - function examineScopes() { - var scopeVariablesSection = test._findNode('//div[@id="scripts-sidebar"]/div[div[@class="title"]/text()="Scope Variables"]'); - var expectedScopes = [ - { - title: "Local", - properties: { - x:"2009", - innerFunctionLocalVar:"2011", - "this": "global", - } - }, - { - title: "Closure", - properties: { - n:"TextParam", - makeClosureLocalVar:"local.TextParam", - } - }, - { - title: "Global", - }, - ]; - var it = test._nodeIterator('./div[@class="body"]/div', scopeVariablesSection); - var scopeIndex = 0; - var scopeDiv; - while (scopeDiv = it.iterateNext()) { - test.assertTrue(scopeIndex < expectedScopes.length, "Too many scopes."); - test._checkScopeSectionDiv(scopeDiv, expectedScopes[scopeIndex]); - ++scopeIndex; - } - test.assertEquals(expectedScopes.length, scopeIndex, "Unexpected number of scopes."); - - test.releaseControl(); - } - - test.takeControl(); -}; - - -/** - * Returns child tree element for a property with given name. - * @param {TreeElement} parent Parent tree element. - * @param {string} childName - * @param {string} objectPath Path to the object. Will be printed in the case - * of failure. - * @return {TreeElement} - */ -TestSuite.prototype._findChildProperty = function(parent, childName, objectPath) -{ - var children = parent.children; - for (var i = 0; i < children.length; i++) { - var treeElement = children[i]; - var property = treeElement.property; - if (property.name === childName) - return treeElement; - } - this.fail('Cannot find property "' + childName + '" in ' + objectPath); -}; - - -/** * Executes the 'code' with InjectedScriptAccess.getProperties overriden * so that all callbacks passed to InjectedScriptAccess.getProperties are * extended with the "hook". @@ -1543,128 +839,6 @@ TestSuite.prototype._hookGetPropertiesCallback = function(hook, code) /** - * Tests that all elements in prototype chain of an object have expected - * intrinic proprties(__proto__, constructor, prototype). - */ -TestSuite.prototype.testDebugIntrinsicProperties = function() -{ - this.showPanel("scripts"); - var test = this; - - this._executeCodeWhenScriptsAreParsed("handleClick()", ["debugger_intrinsic_properties.html$"]); - - this._waitForScriptPause( - { - functionsOnStack: ["callDebugger", "handleClick", "(anonymous function)"], - lineNumber: 29, - lineText: " debugger;" - }, - expandLocalScope); - - var localScopeSection = null; - function expandLocalScope() { - test._expandScopeSections(function(sections, i) { - if (i === 0) { - test.assertTrue(sections[i].object.isLocal, "Scope #0 is not Local."); - localScopeSection = sections[i]; - return true; - } - return false; - }, - examineLocalScope); - } - - function examineLocalScope() { - var scopeExpectations = [ - "a", "Object", [ - "constructor", "function Child()", [ - "constructor", "function Function()", null, - "name", "Child", null, - "prototype", "Object", [ - "childProtoField", 21, null - ] - ], - - "__proto__", "Object", [ - "__proto__", "Object", [ - "__proto__", "Object", [ - "__proto__", "null", null, - "constructor", "function Object()", null, - ], - "constructor", "function Parent()", [ - "name", "Parent", null, - "prototype", "Object", [ - "parentProtoField", 11, null, - ] - ], - "parentProtoField", 11, null, - ], - "constructor", "function Child()", null, - "childProtoField", 21, null, - ], - - "parentField", 10, null, - "childField", 20, null, - ] - ]; - - checkProperty(localScopeSection.propertiesTreeOutline, "<Local Scope>", scopeExpectations); - } - - var propQueue = []; - var index = 0; - var expectedFinalIndex = 8; - - function expandAndCheckNextProperty() { - if (index === propQueue.length) { - test.assertEquals(expectedFinalIndex, index, "Unexpected number of expanded objects."); - test.releaseControl(); - return; - } - - // Read next property data from the queue. - var treeElement = propQueue[index].treeElement; - var path = propQueue[index].path; - var expectations = propQueue[index].expectations; - index++; - - // Expand the property. - test._hookGetPropertiesCallback(function() { - checkProperty(treeElement, path, expectations); - }, - function() { - treeElement.expand(); - }); - } - - function checkProperty(treeElement, path, expectations) { - for (var i = 0; i < expectations.length; i += 3) { - var name = expectations[i]; - var description = expectations[i+1]; - var value = expectations[i+2]; - - var propertyPath = path + "." + name; - var propertyTreeElement = test._findChildProperty(treeElement, name, path); - test.assertTrue(propertyTreeElement, 'Property "' + propertyPath + '" not found.'); - test.assertEquals(description, propertyTreeElement.property.value.description, 'Unexpected "' + propertyPath + '" description.'); - if (value) { - // Schedule property content check. - propQueue.push({ - treeElement: propertyTreeElement, - path: propertyPath, - expectations: value, - }); - } - } - // Check next property in the queue. - expandAndCheckNextProperty(); - } - - test.takeControl(); -}; - - -/** * Tests "Pause" button will pause debugger when a snippet is evaluated. */ TestSuite.prototype.testPauseInEval = function() @@ -1699,138 +873,6 @@ TestSuite.createKeyEvent = function(keyIdentifier) /** - * Tests console eval. - */ -TestSuite.prototype.testConsoleEval = function() -{ - var test = this; - this.evaluateInConsole_("123", - function(resultText) { - test.assertEquals("123", resultText); - test.releaseControl(); - }); - - this.takeControl(); -}; - - -/** - * Tests console log. - */ -TestSuite.prototype.testConsoleLog = function() -{ - WebInspector.console.visible = true; - var messages = WebInspector.console.messages; - var index = 0; - - var test = this; - var assertNext = function(line, message, opt_class, opt_count, opt_substr) { - var elem = messages[index++].toMessageElement(); - var clazz = elem.getAttribute("class"); - var expectation = (opt_count || '') + 'console_test_page.html:' + line + message; - if (opt_substr) - test.assertContains(elem.textContent, expectation); - else - test.assertEquals(expectation, elem.textContent); - if (opt_class) - test.assertContains(clazz, "console-" + opt_class); - }; - - assertNext("5", "log", "log-level"); - assertNext("7", "debug", "log-level"); - assertNext("9", "info", "log-level"); - assertNext("11", "warn", "warning-level"); - assertNext("13", "error", "error-level"); - assertNext("15", "Message format number 1, 2 and 3.5"); - assertNext("17", "Message format for string"); - assertNext("19", "Object Object"); - assertNext("22", "repeated", "log-level", 5); - assertNext("26", "count: 1"); - assertNext("26", "count: 2"); - assertNext("29", "group", "group-title"); - index++; - assertNext("33", "timer:", "log-level", "", true); - assertNext("35", "1 2 3", "log-level"); - assertNext("37", "HTMLDocument", "log-level"); - assertNext("39", "<html>", "log-level", "", true); -}; - - -/** - * Tests eval of global objects. - */ -TestSuite.prototype.testEvalGlobal = function() -{ - WebInspector.console.visible = true; - - var inputs = ["foo", "foobar"]; - var expectations = ["foo", "fooValue", "foobar", "ReferenceError: foobar is not defined"]; - - // Do not change code below - simply add inputs and expectations above. - var initEval = function(input) { - WebInspector.console.prompt.text = input; - WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter")); - }; - var test = this; - var messagesCount = 0; - var inputIndex = 0; - this.addSniffer(WebInspector.ConsoleView.prototype, "addMessage", - function(commandResult) { - messagesCount++; - if (messagesCount === expectations.length) { - var messages = WebInspector.console.messages; - for (var i = 0; i < expectations; ++i) { - var elem = messages[i++].toMessageElement(); - test.assertEquals(elem.textContent, expectations[i]); - } - test.releaseControl(); - } else if (messagesCount % 2 === 0) - initEval(inputs[inputIndex++]); - }, true); - - initEval(inputs[inputIndex++]); - this.takeControl(); -}; - - -/** - * Tests that Storage panel can be open and that local DOM storage is added - * to the panel. - */ -TestSuite.prototype.testShowStoragePanel = function() -{ - var test = this; - this.addSniffer(WebInspector.panels.storage, "addDOMStorage", - function(storage) { - var orig = storage.getEntries; - storage.getEntries = function(callback) { - orig.call(this, function(entries) { - callback(entries); - test.releaseControl(); - }); - }; - try { - WebInspector.currentPanel.selectDOMStorage(storage.id); - storage.getEntries = orig; - } catch (e) { - test.fail("Exception in selectDOMStorage: " + e); - } - }); - this.showPanel("storage"); - - // Access localStorage so that it's pushed to the frontend. - this.evaluateInConsole_( - 'setTimeout("localStorage.x = 10" , 0)', - function(resultText) { - test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText); - }); - - // Wait until DOM storage is added to the panel. - this.takeControl(); -}; - - -/** * Test runner for the test suite. */ var uiTests = {}; @@ -1855,8 +897,37 @@ uiTests.runAllTests = function() */ uiTests.runTest = function(name) { - new TestSuite().runTest(name); + if (uiTests._populatedInterface) + new TestSuite().runTest(name); + else + uiTests._pendingTestName = name; }; +(function() { + +function runTests() +{ + uiTests._populatedInterface = true; + var name = uiTests._pendingTestName; + delete uiTests._pendingTestName; + if (name) + new TestSuite().runTest(name); +} + +var oldShowElementsPanel = WebInspector.showElementsPanel; +WebInspector.showElementsPanel = function() +{ + oldShowElementsPanel.call(this); + runTests(); +} + +var oldShowPanel = WebInspector.showPanel; +WebInspector.showPanel = function(name) +{ + oldShowPanel.call(this, name); + runTests(); +} + +})(); } diff --git a/WebKit/chromium/src/js/devTools.css b/WebKit/chromium/src/js/devTools.css index 1fa935f..64ea9d5 100755..100644 --- a/WebKit/chromium/src/js/devTools.css +++ b/WebKit/chromium/src/js/devTools.css @@ -1,7 +1,3 @@ -#scripts-files option.injected { - color: rgb(70, 134, 240); -} - .data-grid table { line-height: 120%; } @@ -13,200 +9,98 @@ body.attached #toolbar { padding-left: 0; } - /* Chrome theme overrides */ -body.platform-windows #toolbar { - background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(242, 247, 253)), to(rgb(223, 234, 248))); -} - -body.platform-windows.inactive #toolbar { - background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(248, 248, 248)), to(rgb(237, 237, 237))); -} - - -/* Heap Profiler Styles */ - -.heap-snapshot-status-bar-item .glyph { - -webkit-mask-image: url(Images/focusButtonGlyph.png); -} -.heap-snapshot-sidebar-tree-item .icon { - content: url(Images/profileIcon.png); -} - -.heap-snapshot-sidebar-tree-item.small .icon { - content: url(Images/profileSmallIcon.png); -} - -.heap-snapshot-view { - display: none; - overflow: hidden; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -.heap-snapshot-view.visible { - display: block; -} - -.heap-snapshot-view .data-grid { - border: none; - max-height: 100%; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 93px; -} - -.heap-snapshot-view .data-grid th.count-column { - text-align: center; -} - -.heap-snapshot-view .data-grid td.count-column { - text-align: right; -} - -.heap-snapshot-view .data-grid th.size-column { - text-align: center; -} - -.heap-snapshot-view .data-grid td.size-column { - text-align: right; -} - -.heap-snapshot-view .data-grid th.countDelta-column { - text-align: center; -} - -.heap-snapshot-view .data-grid td.countDelta-column { - text-align: right; -} - -.heap-snapshot-view .data-grid th.sizeDelta-column { - text-align: center; -} - -.heap-snapshot-view .data-grid td.sizeDelta-column { - text-align: right; +body.platform-windows #toolbar, body.platform-windows.inactive #toolbar { + background-image: none; } -#heap-snapshot-summary-container { - position: absolute; - padding-top: 20px; - bottom: 0; - left: 0; - right: 0; - height: 93px; - margin-left: -1px; - border-left: 1px solid rgb(102, 102, 102); - background-color: rgb(101, 111, 130); - background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); - background-repeat: repeat-x; - background-position: top; - text-align: center; - text-shadow: black 0 1px 1px; - white-space: nowrap; - color: white; - -webkit-background-size: 1px 6px; - -webkit-background-origin: padding; - -webkit-background-clip: padding; +body.detached.platform-mac-leopard #toolbar { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(175, 175, 175)), to(rgb(151, 151, 151))) !important; } -.heap-snapshot-summary { - display: inline-block; - width: 50%; - min-width: 300px; - position: relative; +body.detached.platform-mac-leopard.inactive #toolbar { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(221, 221, 221)), to(rgb(207, 207, 207))) !important; } -.heap-snapshot-summary canvas.summary-graph { - width: 225px; +body.detached.platform-mac-snowleopard #toolbar { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(189, 189, 189)), to(rgb(151, 151, 151))) !important; } -.heap-snapshot-summary-label { - font-size: 12px; - font-weight: bold; - position: absolute; - top: 1px; - width: 50%; - left: 25%; +body.detached.platform-mac-snowleopard.inactive #toolbar { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(215, 215, 215)), to(rgb(207, 207, 207))) !important; } -body.platform-windows .section > .header { - border: 1px solid rgb(92, 116, 157); - background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(105, 133, 180)), to(rgb(92, 116, 157))); +body.platform-linux #scripts-files { + font-size: 11px; + font-weight: normal; + line-height: 12px; } -body.platform-windows .console-group-messages .section > .header { +.console-group-messages .section > .header { padding: 0 8px 0 0; background-image: none; border: none; min-height: 0; } -body.platform-windows #resources-filter { +#resources-filter { background: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(233, 233, 233))); } -body.platform-windows .crumbs .crumb { +.crumbs .crumb { -webkit-border-image: url(Images/segmentChromium.png) 0 12 0 2; + margin-right: -3px; + padding-left: 6px; } -body.platform-windows .crumbs .crumb.end { - -webkit-border-image: url(Images/segmentEndChromium.png) 0 2 0 2; -} - -body.platform-windows .crumbs .crumb.selected { +.crumbs .crumb.selected { -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2; color: white; text-shadow: rgba(255, 255, 255, 0.5) 0 0px 0; } -body.platform-windows .crumbs .crumb.selected:hover { +.crumbs .crumb.selected:hover { -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2; } -body.platform-windows .crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover { +.crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover { -webkit-border-image: url(Images/segmentSelectedEndChromium.png) 0 2 0 2; } -body.platform-windows .crumbs .crumb:hover { +.crumbs .crumb:hover { -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2; } -body.platform-windows .crumbs .crumb.dimmed:hover { +.crumbs .crumb.dimmed:hover { -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2; } -body.platform-windows .crumbs .crumb.end:hover { +.crumbs .crumb.end:hover { -webkit-border-image: url(Images/segmentHoverEndChromium.png) 0 2 0 2; } -body.platform-windows body.drawer-visible #main-status-bar { +body.drawer-visible #main-status-bar { background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackgroundChromium.png); } -body.platform-windows .status-bar { +.status-bar { background-image: url(Images/statusbarBackgroundChromium.png); } -body.platform-windows button.status-bar-item { +button.status-bar-item { background-image: url(Images/statusbarButtonsChromium.png); } -body.platform-windows select.status-bar-item:active { +select.status-bar-item:active { -webkit-border-image: url(Images/statusbarMenuButtonSelectedChromium.png) 0 17 0 2; } -body.platform-windows #drawer { +#drawer { background-image: url(Images/statusbarBottomBackgroundChromium.png); } -body.platform-windows select.status-bar-item { +select.status-bar-item { -webkit-border-image: url(Images/statusbarMenuButtonChromium.png) 0 17 0 2; } @@ -218,6 +112,6 @@ body.platform-windows select.status-bar-item { -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0); } -.timeline-category-tree-item input { +.timeline-category-statusbar-item input { vertical-align: middle; } diff --git a/WebKit/chromium/src/linux/WebFontRenderStyle.cpp b/WebKit/chromium/src/linux/WebFontRenderStyle.cpp new file mode 100644 index 0000000..0b864d1 --- /dev/null +++ b/WebKit/chromium/src/linux/WebFontRenderStyle.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "config.h" +#include "WebFontRenderStyle.h" + +#include "FontRenderStyle.h" + +using WebCore::FontRenderStyle; + +namespace WebKit { + +void WebFontRenderStyle::toFontRenderStyle(FontRenderStyle* out) +{ + out->useBitmaps = useBitmaps; + out->useAutoHint = useAutoHint; + out->useHinting = useHinting; + out->hintStyle = hintStyle; + out->useAntiAlias = useAntiAlias; + out->useSubpixel = useSubpixel; +} + +void WebFontRenderStyle::setDefaults() +{ + useBitmaps = 2; + useAutoHint = 2; + useHinting = 2; + hintStyle = 0; + useAntiAlias = 2; + useSubpixel = 2; +} + +} // namespace WebKit diff --git a/WebKit/chromium/src/mac/WebInputEventFactory.mm b/WebKit/chromium/src/mac/WebInputEventFactory.mm index 46b0afe..55883c9 100644 --- a/WebKit/chromium/src/mac/WebInputEventFactory.mm +++ b/WebKit/chromium/src/mac/WebInputEventFactory.mm @@ -856,11 +856,36 @@ static inline int modifiersFromEvent(NSEvent* event) { modifiers |= WebInputEvent::AltKey; if ([event modifierFlags] & NSCommandKeyMask) modifiers |= WebInputEvent::MetaKey; + if ([event modifierFlags] & NSAlphaShiftKeyMask) + modifiers |= WebInputEvent::CapsLockOn; // TODO(port): Set mouse button states return modifiers; } +static inline void setWebEventLocationFromEventInView(WebMouseEvent* result, + NSEvent* event, + NSView* view) { + NSPoint windowLocal = [event locationInWindow]; + + NSPoint screenLocal = [[view window] convertBaseToScreen:windowLocal]; + result->globalX = screenLocal.x; + // Flip y. + NSScreen* primaryScreen = ([[NSScreen screens] count] > 0) ? + [[NSScreen screens] objectAtIndex:0] : nil; + if (primaryScreen) + result->globalY = [primaryScreen frame].size.height - screenLocal.y; + else + result->globalY = screenLocal.y; + + NSPoint contentLocal = [view convertPoint:windowLocal fromView:nil]; + result->x = contentLocal.x; + result->y = [view frame].size.height - contentLocal.y; // Flip y. + + result->windowX = result->x; + result->windowY = result->y; +} + WebKeyboardEvent WebInputEventFactory::keyboardEvent(NSEvent* event) { WebKeyboardEvent result; @@ -991,14 +1016,17 @@ WebMouseEvent WebInputEventFactory::mouseEvent(NSEvent* event, NSView* view) break; case NSLeftMouseUp: result.type = WebInputEvent::MouseUp; + result.clickCount = [event clickCount]; result.button = WebMouseEvent::ButtonLeft; break; case NSOtherMouseUp: result.type = WebInputEvent::MouseUp; + result.clickCount = [event clickCount]; result.button = WebMouseEvent::ButtonMiddle; break; case NSRightMouseUp: result.type = WebInputEvent::MouseUp; + result.clickCount = [event clickCount]; result.button = WebMouseEvent::ButtonRight; break; case NSMouseMoved: @@ -1021,16 +1049,7 @@ WebMouseEvent WebInputEventFactory::mouseEvent(NSEvent* event, NSView* view) ASSERT_NOT_REACHED(); } - NSPoint location = [NSEvent mouseLocation]; // global coordinates - result.globalX = location.x; - result.globalY = [[[view window] screen] frame].size.height - location.y; - - NSPoint windowLocal = [event locationInWindow]; - location = [view convertPoint:windowLocal fromView:nil]; - result.y = [view frame].size.height - location.y; // flip y - result.x = location.x; - result.windowX = result.x; - result.windowY = result.y; + setWebEventLocationFromEventInView(&result, event, view); result.modifiers = modifiersFromEvent(event); @@ -1050,16 +1069,7 @@ WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(NSEvent* event, NSView* result.modifiers = modifiersFromEvent(event); - // Set coordinates by translating event coordinates from screen to client. - NSPoint location = [NSEvent mouseLocation]; // global coordinates - result.globalX = location.x; - result.globalY = location.y; - NSPoint windowLocal = [event locationInWindow]; - location = [view convertPoint:windowLocal fromView:nil]; - result.x = location.x; - result.y = [view frame].size.height - location.y; // flip y - result.windowX = result.x; - result.windowY = result.y; + setWebEventLocationFromEventInView(&result, event, view); // Of Mice and Men // --------------- @@ -1173,22 +1183,19 @@ WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(NSEvent* event, NSView* // the point delta data instead, since we cannot distinguish trackpad data // from data from any other continuous device. + // Conversion between wheel delta amounts and number of pixels to scroll. + static const double scrollbarPixelsPerCocoaTick = 40.0; + if (CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventIsContinuous)) { - result.wheelTicksY = result.deltaY = - CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis1); - result.wheelTicksX = result.deltaX = - CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis2); + result.deltaX = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis2); + result.deltaY = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis1); + result.wheelTicksX = result.deltaX / scrollbarPixelsPerCocoaTick; + result.wheelTicksY = result.deltaY / scrollbarPixelsPerCocoaTick; } else { - result.wheelTicksY = - CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis1); - result.wheelTicksX = - CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis2); - - // Convert wheel delta amount to a number of pixels to scroll. - static const double scrollbarPixelsPerCocoaTick = 40.0; - result.deltaX = [event deltaX] * scrollbarPixelsPerCocoaTick; result.deltaY = [event deltaY] * scrollbarPixelsPerCocoaTick; + result.wheelTicksY = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis1); + result.wheelTicksX = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis2); } result.timeStampSeconds = [event timestamp]; diff --git a/WebKit/chromium/src/win/WebInputEventFactory.cpp b/WebKit/chromium/src/win/WebInputEventFactory.cpp index a5bd935..c71a3b6 100644 --- a/WebKit/chromium/src/win/WebInputEventFactory.cpp +++ b/WebKit/chromium/src/win/WebInputEventFactory.cpp @@ -86,6 +86,16 @@ static bool isKeyPad(WPARAM wparam, LPARAM lparam) return keypad; } +// Loads the state for toggle keys into the event. +static void SetToggleKeyState(WebInputEvent* event) +{ + // Low bit set from GetKeyState indicates "toggled". + if (::GetKeyState(VK_NUMLOCK) & 1) + event->modifiers |= WebInputEvent::NumLockOn; + if (::GetKeyState(VK_CAPITAL) & 1) + event->modifiers |= WebInputEvent::CapsLockOn; +} + WebKeyboardEvent WebInputEventFactory::keyboardEvent(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { @@ -144,6 +154,7 @@ WebKeyboardEvent WebInputEventFactory::keyboardEvent(HWND hwnd, UINT message, if (isKeyPad(wparam, lparam)) result.modifiers |= WebInputEvent::IsKeyPad; + SetToggleKeyState(&result); return result; } @@ -289,6 +300,7 @@ WebMouseEvent WebInputEventFactory::mouseEvent(HWND hwnd, UINT message, if (wparam & MK_RBUTTON) result.modifiers |= WebInputEvent::RightButtonDown; + SetToggleKeyState(&result); return result; } @@ -386,6 +398,8 @@ WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(HWND hwnd, UINT message if (keyState & MK_RBUTTON) result.modifiers |= WebInputEvent::RightButtonDown; + SetToggleKeyState(&result); + // Set coordinates by translating event coordinates from screen to client. POINT clientPoint = { result.globalX, result.globalY }; MapWindowPoints(0, hwnd, &clientPoint, 1); @@ -398,11 +412,14 @@ WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(HWND hwnd, UINT message // // How many pixels should we scroll per line? Gecko uses the height of the // current line, which means scroll distance changes as you go through the - // page or go to different pages. IE 7 is ~50 px/line, although the value - // seems to vary slightly by page and zoom level. Since IE 7 has a smoothing - // algorithm on scrolling, it can get away with slightly larger scroll values - // without feeling jerky. Here we use 100 px per three lines (the default - // scroll amount is three lines per wheel tick). + // page or go to different pages. IE 8 is ~60 px/line, although the value + // seems to vary slightly by page and zoom level. Also, IE defaults to + // smooth scrolling while Firefox doesn't, so it can get away with somewhat + // larger scroll values without feeling as jerky. Here we use 100 px per + // three lines (the default scroll amount is three lines per wheel tick). + // Even though we have smooth scrolling, we don't make this as large as IE + // because subjectively IE feels like it scrolls farther than you want while + // reading articles. static const float scrollbarPixelsPerLine = 100.0f / 3.0f; wheelDelta /= WHEEL_DELTA; float scrollDelta = wheelDelta; |