diff options
author | Kristian Monsen <kristianm@google.com> | 2010-09-08 12:18:00 +0100 |
---|---|---|
committer | Kristian Monsen <kristianm@google.com> | 2010-09-11 12:08:58 +0100 |
commit | 5ddde30071f639962dd557c453f2ad01f8f0fd00 (patch) | |
tree | 775803c4ab35af50aa5f5472cd1fb95fe9d5152d /WebKit/chromium/src | |
parent | 3e63d9b33b753ca86d0765d1b3d711114ba9e34f (diff) | |
download | external_webkit-5ddde30071f639962dd557c453f2ad01f8f0fd00.zip external_webkit-5ddde30071f639962dd557c453f2ad01f8f0fd00.tar.gz external_webkit-5ddde30071f639962dd557c453f2ad01f8f0fd00.tar.bz2 |
Merge WebKit at r66666 : Initial merge by git.
Change-Id: I57dedeb49859adc9c539e760f0e749768c66626f
Diffstat (limited to 'WebKit/chromium/src')
33 files changed, 401 insertions, 1889 deletions
diff --git a/WebKit/chromium/src/AssertMatchingEnums.cpp b/WebKit/chromium/src/AssertMatchingEnums.cpp index a117fc2..ac3aad3 100644 --- a/WebKit/chromium/src/AssertMatchingEnums.cpp +++ b/WebKit/chromium/src/AssertMatchingEnums.cpp @@ -35,6 +35,7 @@ #include "AccessibilityObject.h" #include "ApplicationCacheHost.h" +#include "AsyncFileSystem.h" #include "EditorInsertAction.h" #include "FontDescription.h" #include "FontSmoothingMode.h" @@ -54,6 +55,7 @@ #include "WebClipboard.h" #include "WebCursorInfo.h" #include "WebEditingAction.h" +#include "WebFileSystem.h" #include "WebFontDescription.h" #include "WebIDBKey.h" #include "WebInputElement.h" @@ -380,3 +382,8 @@ COMPILE_ASSERT_MATCHING_ENUM(WebView::UserContentInjectInTopFrameOnly, InjectInT 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); +#endif diff --git a/WebKit/chromium/src/AsyncFileSystemChromium.cpp b/WebKit/chromium/src/AsyncFileSystemChromium.cpp new file mode 100644 index 0000000..08fcea6 --- /dev/null +++ b/WebKit/chromium/src/AsyncFileSystemChromium.cpp @@ -0,0 +1,104 @@ +/* + * 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 "FileSystem.h" +#include "WebFileSystem.h" +#include "WebFileSystemCallbacksImpl.h" +#include "WebKit.h" +#include "WebKitClient.h" + +#include <wtf/text/CString.h> + +namespace WebCore { + +AsyncFileSystemChromium::AsyncFileSystemChromium(const String& rootPath) + : AsyncFileSystem(rootPath) + , m_webFileSystem(WebKit::webKitClient()->fileSystem()) +{ + ASSERT(m_webFileSystem); +} + +AsyncFileSystemChromium::~AsyncFileSystemChromium() +{ +} + +void AsyncFileSystemChromium::move(const String& srcPath, const String& destPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->move(srcPath, destPath, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::copy(const String& srcPath, const String& destPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->copy(srcPath, destPath, new WebKit::WebFileSystemCallbacksImpl(callbacks)); +} + +void AsyncFileSystemChromium::remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) +{ + m_webFileSystem->remove(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)); +} + +} // namespace WebCore + +#endif diff --git a/WebKit/chromium/src/AsyncFileSystemChromium.h b/WebKit/chromium/src/AsyncFileSystemChromium.h new file mode 100644 index 0000000..f46f78c --- /dev/null +++ b/WebKit/chromium/src/AsyncFileSystemChromium.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: + * + * * 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/PassRefPtr.h> + +namespace WebKit { +class WebFileSystem; +} + +namespace WebCore { + +class AsyncFileSystemCallbacks; + +class AsyncFileSystemChromium : public AsyncFileSystem { +public: + AsyncFileSystemChromium(const String& rootPath); + virtual ~AsyncFileSystemChromium(); + + virtual void move(const String& srcPath, const String& destPath, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void copy(const String& srcPath, const String& destPath, PassOwnPtr<AsyncFileSystemCallbacks>); + virtual void remove(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>); + +private: + WebKit::WebFileSystem* m_webFileSystem; +}; + +} // namespace WebCore + +#endif + +#endif // AsyncFileSystemChromium_h diff --git a/WebKit/chromium/src/ChromeClientImpl.cpp b/WebKit/chromium/src/ChromeClientImpl.cpp index 405fbf6..e6f1400 100644 --- a/WebKit/chromium/src/ChromeClientImpl.cpp +++ b/WebKit/chromium/src/ChromeClientImpl.cpp @@ -712,6 +712,13 @@ void ChromeClientImpl::didChangeAccessibilityObjectState(AccessibilityObject* ob m_webView->client()->didChangeAccessibilityObjectState(WebAccessibilityObject(obj)); } +void ChromeClientImpl::didChangeAccessibilityObjectChildren(WebCore::AccessibilityObject* obj) +{ + // Alert assistive technology about the accessibility object children change + if (obj) + m_webView->client()->didChangeAccessibilityObjectChildren(WebAccessibilityObject(obj)); +} + #if ENABLE(NOTIFICATIONS) NotificationPresenter* ChromeClientImpl::notificationPresenter() const { @@ -744,18 +751,6 @@ void ChromeClientImpl::scheduleCompositingLayerSync() } #endif -#if USE(GLES2_RENDERING) -PassOwnPtr<GLES2Context> ChromeClientImpl::getOnscreenGLES2Context() -{ - return m_webView->getOnscreenGLES2Context(); -} - -PassOwnPtr<GLES2Context> ChromeClientImpl::getOffscreenGLES2Context() -{ - return m_webView->getOffscreenGLES2Context(); -} -#endif - bool ChromeClientImpl::supportsFullscreenForNode(const WebCore::Node* node) { if (m_webView->client() && node->hasTagName(WebCore::HTMLNames::videoTag)) diff --git a/WebKit/chromium/src/ChromeClientImpl.h b/WebKit/chromium/src/ChromeClientImpl.h index 8763def..bff9f90 100644 --- a/WebKit/chromium/src/ChromeClientImpl.h +++ b/WebKit/chromium/src/ChromeClientImpl.h @@ -152,11 +152,6 @@ public: virtual void scheduleCompositingLayerSync(); #endif -#if USE(GLES2_RENDERING) - virtual PassOwnPtr<WebCore::GLES2Context> getOnscreenGLES2Context(); - virtual PassOwnPtr<WebCore::GLES2Context> getOffscreenGLES2Context(); -#endif - virtual bool supportsFullscreenForNode(const WebCore::Node*); virtual void enterFullscreenForNode(WebCore::Node*); virtual void exitFullscreenForNode(WebCore::Node*); @@ -167,6 +162,7 @@ public: bool handleExternally); virtual void popupClosed(WebCore::PopupContainer* popupContainer); virtual void didChangeAccessibilityObjectState(WebCore::AccessibilityObject*); + virtual void didChangeAccessibilityObjectChildren(WebCore::AccessibilityObject*); // ChromeClientImpl: void setCursor(const WebCursorInfo& cursor); diff --git a/WebKit/chromium/src/ChromiumBridge.cpp b/WebKit/chromium/src/ChromiumBridge.cpp index 33f405d..911dcf3 100644 --- a/WebKit/chromium/src/ChromiumBridge.cpp +++ b/WebKit/chromium/src/ChromiumBridge.cpp @@ -200,11 +200,11 @@ void ChromiumBridge::clipboardWriteImage(NativeImagePtr image, webKitClient()->clipboard()->writeImage(webImage, sourceURL, title); } -void ChromiumBridge::clipboardWriteData(ClipboardData* data) +void ChromiumBridge::clipboardWriteData(const String& type, + const String& data, + const String& metadata) { - notImplemented(); - WebDragData dragData; // FIXME: Define the conversion from ClipboardData to WebDragData. - webKitClient()->clipboard()->writeData(dragData); + webKitClient()->clipboard()->writeData(type, data, metadata); } HashSet<String> ChromiumBridge::clipboardReadAvailableTypes( diff --git a/WebKit/chromium/src/IDBCursorBackendProxy.cpp b/WebKit/chromium/src/IDBCursorBackendProxy.cpp index fff00b7..b4711eb 100644 --- a/WebKit/chromium/src/IDBCursorBackendProxy.cpp +++ b/WebKit/chromium/src/IDBCursorBackendProxy.cpp @@ -60,10 +60,9 @@ PassRefPtr<IDBKey> IDBCursorBackendProxy::key() const return m_idbCursor->key(); } -PassRefPtr<IDBAny> IDBCursorBackendProxy::value() const +PassRefPtr<SerializedScriptValue> IDBCursorBackendProxy::value() const { - RefPtr<SerializedScriptValue> value = PassRefPtr<SerializedScriptValue>(m_idbCursor->value()); - return IDBAny::create(value.get()); + return m_idbCursor->value(); } void IDBCursorBackendProxy::update(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBCallbacks> callbacks) diff --git a/WebKit/chromium/src/IDBCursorBackendProxy.h b/WebKit/chromium/src/IDBCursorBackendProxy.h index d8b621a..8af27cf 100644 --- a/WebKit/chromium/src/IDBCursorBackendProxy.h +++ b/WebKit/chromium/src/IDBCursorBackendProxy.h @@ -44,7 +44,7 @@ public: virtual unsigned short direction() const; virtual PassRefPtr<IDBKey> key() const; - virtual PassRefPtr<IDBAny> value() const; + virtual PassRefPtr<SerializedScriptValue> value() const; virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>); virtual void continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>); virtual void remove(PassRefPtr<IDBCallbacks>); diff --git a/WebKit/chromium/src/IDBDatabaseProxy.cpp b/WebKit/chromium/src/IDBDatabaseProxy.cpp index 9aa2977..ce5e0a6 100644 --- a/WebKit/chromium/src/IDBDatabaseProxy.cpp +++ b/WebKit/chromium/src/IDBDatabaseProxy.cpp @@ -94,6 +94,11 @@ void IDBDatabaseProxy::removeObjectStore(const String& name, PassRefPtr<IDBCallb m_webIDBDatabase->removeObjectStore(name, new WebIDBCallbacksImpl(callbacks)); } +void IDBDatabaseProxy::setVersion(const String& version, PassRefPtr<IDBCallbacks> callbacks) +{ + m_webIDBDatabase->setVersion(version, new WebIDBCallbacksImpl(callbacks)); +} + PassRefPtr<IDBTransactionBackendInterface> IDBDatabaseProxy::transaction(DOMStringList* storeNames, unsigned short mode, unsigned long timeout) { WebKit::WebDOMStringList names(storeNames); diff --git a/WebKit/chromium/src/IDBDatabaseProxy.h b/WebKit/chromium/src/IDBDatabaseProxy.h index ed2016a..42a7d7e 100644 --- a/WebKit/chromium/src/IDBDatabaseProxy.h +++ b/WebKit/chromium/src/IDBDatabaseProxy.h @@ -52,6 +52,7 @@ public: virtual void createObjectStore(const String& name, const String& keyPath, bool autoIncrement, PassRefPtr<IDBCallbacks>); virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name, unsigned short mode); virtual void removeObjectStore(const String& name, PassRefPtr<IDBCallbacks>); + virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>); virtual PassRefPtr<IDBTransactionBackendInterface> transaction(DOMStringList* storeNames, unsigned short mode, unsigned long timeout); private: diff --git a/WebKit/chromium/src/LocalFileSystemChromium.cpp b/WebKit/chromium/src/LocalFileSystemChromium.cpp new file mode 100644 index 0000000..45365ef --- /dev/null +++ b/WebKit/chromium/src/LocalFileSystemChromium.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 "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" + +using namespace WebKit; + +namespace WebCore { + +PassRefPtr<LocalFileSystem> LocalFileSystem::create(const String& path) +{ + return adoptRef(new LocalFileSystem(path)); +} + +void LocalFileSystem::requestFileSystem(ScriptExecutionContext* context, AsyncFileSystem::Type type, long long size, PassRefPtr<FileSystemCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) +{ + 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, new WebFileSystemCallbacksImpl(new FileSystemCallbacks(successCallback, errorCallback, context))); + } else { + // FIXME: Add implementation for workers. + } +} + +} // namespace WebCore + +#endif // ENABLE(FILE_SYSTEM) diff --git a/WebKit/chromium/src/WebBindings.cpp b/WebKit/chromium/src/WebBindings.cpp index 3aaebfd..4bb9022 100644 --- a/WebKit/chromium/src/WebBindings.cpp +++ b/WebKit/chromium/src/WebBindings.cpp @@ -43,6 +43,7 @@ #include "Range.h" #include "V8BindingState.h" #include "V8DOMWrapper.h" +#include "V8Element.h" #include "V8Event.h" #include "V8Helpers.h" #include "V8HiddenPropertyName.h" @@ -53,6 +54,7 @@ #include "bridge/c/c_utility.h" #endif #include "WebDragData.h" +#include "WebElement.h" #include "WebRange.h" #if USE(JAVASCRIPTCORE_BINDINGS) @@ -295,6 +297,21 @@ 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; +} + #endif bool WebBindings::getDragData(NPObject* event, int* eventId, WebDragData* data) @@ -323,6 +340,16 @@ 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 +} + void WebBindings::pushExceptionHandler(ExceptionHandler handler, void* data) { WebCore::pushExceptionHandler(handler, data); diff --git a/WebKit/chromium/src/WebElement.cpp b/WebKit/chromium/src/WebElement.cpp index f45cba9..91f310d 100644 --- a/WebKit/chromium/src/WebElement.cpp +++ b/WebKit/chromium/src/WebElement.cpp @@ -85,6 +85,11 @@ WebString WebElement::innerText() const return constUnwrap<Element>()->innerText(); } +WebString WebElement::computeInheritedLanguage() const +{ + return WebString(constUnwrap<Element>()->computeInheritedLanguage()); +} + WebElement::WebElement(const PassRefPtr<Element>& elem) : WebNode(elem) { diff --git a/WebKit/chromium/src/WebEntities.cpp b/WebKit/chromium/src/WebEntities.cpp index 2e05d52..bfdd9f2 100644 --- a/WebKit/chromium/src/WebEntities.cpp +++ b/WebKit/chromium/src/WebEntities.cpp @@ -33,7 +33,6 @@ #include <string.h> -#include "HTMLEntityTable.h" #include "PlatformString.h" #include "StringBuilder.h" #include <wtf/HashMap.h> @@ -44,49 +43,17 @@ using namespace WebCore; namespace WebKit { -namespace { - -void populateMapFromXMLEntities(WTF::HashMap<int, WTF::String>& map) -{ - ASSERT(map.isEmpty()); - map.set(0x003c, "lt"); - map.set(0x003e, "gt"); - map.set(0x0026, "amp"); - map.set(0x0027, "apos"); - map.set(0x0022, "quot"); -} - -void populateMapFromHTMLEntityTable(WTF::HashMap<int, WTF::String>& map) -{ - ASSERT(map.isEmpty()); - const HTMLEntityTableEntry* entry = HTMLEntityTable::firstEntry(); - const HTMLEntityTableEntry* end = HTMLEntityTable::lastEntry() + 1; - for (; entry != end; ++entry) { - String entity = entry->entity; - int value = entry->value; - ASSERT(value && !entity.isEmpty()); - if (entity[entity.length() - 1] != ';') - continue; // We want the canonical version that ends in ; - // For consistency, use the lower case for entities that have both. - if (map.contains(value) && map.get(value) == entity.lower()) - continue; - // Don't register %, ⊅ and &supl; for some unknown reason. - if (value == '%' || value == 0x2285 || value == 0x00b9) - continue; - map.set(value, entity); - } - // We add #39 for some unknown reason. - map.set(0x0027, String("#39")); -} - -} - WebEntities::WebEntities(bool xmlEntities) { - if (xmlEntities) - populateMapFromXMLEntities(m_entitiesMap); - else - populateMapFromHTMLEntityTable(m_entitiesMap); + 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 diff --git a/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp b/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp index d29f86d..a23add7 100644 --- a/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp +++ b/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp @@ -32,8 +32,9 @@ #if ENABLE(FILE_SYSTEM) +#include "AsyncFileSystemCallbacks.h" +#include "AsyncFileSystemChromium.h" #include "ExceptionCode.h" -#include "FileSystemCallbacks.h" #include "WebFileSystemEntry.h" #include "WebFileInfo.h" #include "WebString.h" @@ -43,7 +44,7 @@ using namespace WebCore; namespace WebKit { -WebFileSystemCallbacksImpl::WebFileSystemCallbacksImpl(PassOwnPtr<FileSystemCallbacksBase> callbacks) +WebFileSystemCallbacksImpl::WebFileSystemCallbacksImpl(PassOwnPtr<AsyncFileSystemCallbacks> callbacks) : m_callbacks(callbacks) { } @@ -71,14 +72,14 @@ void WebFileSystemCallbacksImpl::didReadDirectory(const WebVector<WebFileSystemE ASSERT(m_callbacks); for (size_t i = 0; i < entries.size(); ++i) m_callbacks->didReadDirectoryEntry(entries[i].name, entries[i].isDirectory); - m_callbacks->didReadDirectoryChunkDone(hasMore); + m_callbacks->didReadDirectoryEntries(hasMore); if (!hasMore) delete this; } void WebFileSystemCallbacksImpl::didOpenFileSystem(const WebString& name, const WebString& path) { - m_callbacks->didOpenFileSystem(name, path); + m_callbacks->didOpenFileSystem(name, new AsyncFileSystemChromium(path)); delete this; } diff --git a/WebKit/chromium/src/WebFileSystemCallbacksImpl.h b/WebKit/chromium/src/WebFileSystemCallbacksImpl.h index f3c6bc3..b9c825b 100644 --- a/WebKit/chromium/src/WebFileSystemCallbacksImpl.h +++ b/WebKit/chromium/src/WebFileSystemCallbacksImpl.h @@ -37,7 +37,7 @@ #include <wtf/PassOwnPtr.h> namespace WebCore { -class FileSystemCallbacksBase; +class AsyncFileSystemCallbacks; } namespace WebKit { @@ -48,7 +48,7 @@ class WebString; class WebFileSystemCallbacksImpl : public WebFileSystemCallbacks { public: - WebFileSystemCallbacksImpl(PassOwnPtr<WebCore::FileSystemCallbacksBase>); + WebFileSystemCallbacksImpl(PassOwnPtr<WebCore::AsyncFileSystemCallbacks>); virtual ~WebFileSystemCallbacksImpl(); virtual void didSucceed(); @@ -58,7 +58,7 @@ public: virtual void didFail(WebFileError error); private: - OwnPtr<WebCore::FileSystemCallbacksBase> m_callbacks; + OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks; }; } // namespace WebKit diff --git a/WebKit/chromium/src/WebFrameImpl.cpp b/WebKit/chromium/src/WebFrameImpl.cpp index 4375e73..eb0db7e 100644 --- a/WebKit/chromium/src/WebFrameImpl.cpp +++ b/WebKit/chromium/src/WebFrameImpl.cpp @@ -1690,6 +1690,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 @@ -1811,7 +1816,7 @@ 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) diff --git a/WebKit/chromium/src/WebFrameImpl.h b/WebKit/chromium/src/WebFrameImpl.h index 00e8ecb..14217fa 100644 --- a/WebKit/chromium/src/WebFrameImpl.h +++ b/WebKit/chromium/src/WebFrameImpl.h @@ -176,6 +176,7 @@ public: 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; diff --git a/WebKit/chromium/src/WebIDBCursorImpl.cpp b/WebKit/chromium/src/WebIDBCursorImpl.cpp index 1ade687..b74d680 100644 --- a/WebKit/chromium/src/WebIDBCursorImpl.cpp +++ b/WebKit/chromium/src/WebIDBCursorImpl.cpp @@ -57,7 +57,7 @@ WebIDBKey WebIDBCursorImpl::key() const WebSerializedScriptValue WebIDBCursorImpl::value() const { - return m_idbCursorBackend->value()->serializedScriptValue(); + return m_idbCursorBackend->value(); } void WebIDBCursorImpl::update(const WebSerializedScriptValue& value, WebIDBCallbacks* callbacks) diff --git a/WebKit/chromium/src/WebIDBDatabaseImpl.cpp b/WebKit/chromium/src/WebIDBDatabaseImpl.cpp index bd3600f..8870ff9 100644 --- a/WebKit/chromium/src/WebIDBDatabaseImpl.cpp +++ b/WebKit/chromium/src/WebIDBDatabaseImpl.cpp @@ -87,6 +87,11 @@ void WebIDBDatabaseImpl::removeObjectStore(const WebString& name, WebIDBCallback m_databaseBackend->removeObjectStore(name, IDBCallbacksProxy::create(callbacks)); } +void WebIDBDatabaseImpl::setVersion(const WebString& version, WebIDBCallbacks* callbacks) +{ + m_databaseBackend->setVersion(version, IDBCallbacksProxy::create(callbacks)); +} + WebIDBTransaction* WebIDBDatabaseImpl::transaction(const WebDOMStringList& names, unsigned short mode, unsigned long timeout) { RefPtr<DOMStringList> nameList = PassRefPtr<DOMStringList>(names); diff --git a/WebKit/chromium/src/WebIDBDatabaseImpl.h b/WebKit/chromium/src/WebIDBDatabaseImpl.h index 9ae74e0..e0eaaa5 100644 --- a/WebKit/chromium/src/WebIDBDatabaseImpl.h +++ b/WebKit/chromium/src/WebIDBDatabaseImpl.h @@ -52,6 +52,7 @@ public: virtual void createObjectStore(const WebString& name, const WebString& keyPath, bool autoIncrement, WebIDBCallbacks* callbacks); virtual WebIDBObjectStore* objectStore(const WebString& name, unsigned short mode); virtual void removeObjectStore(const WebString& name, WebIDBCallbacks* callbacks); + virtual void setVersion(const WebString& version, WebIDBCallbacks* callbacks); virtual WebIDBTransaction* transaction(const WebDOMStringList& names, unsigned short mode, unsigned long timeout); private: diff --git a/WebKit/chromium/src/WebInputElement.cpp b/WebKit/chromium/src/WebInputElement.cpp index 3b88335..7bf6407 100644 --- a/WebKit/chromium/src/WebInputElement.cpp +++ b/WebKit/chromium/src/WebInputElement.cpp @@ -140,6 +140,11 @@ int WebInputElement::selectionEnd() return unwrap<HTMLInputElement>()->selectionEnd(); } +bool WebInputElement::isValidValue(const WebString& value) const +{ + return constUnwrap<HTMLInputElement>()->isValidValue(value); +} + WebInputElement::WebInputElement(const PassRefPtr<HTMLInputElement>& elem) : WebFormControlElement(elem) { diff --git a/WebKit/chromium/src/WebNotification.cpp b/WebKit/chromium/src/WebNotification.cpp index 6aa8439..bfc1bec 100644 --- a/WebKit/chromium/src/WebNotification.cpp +++ b/WebKit/chromium/src/WebNotification.cpp @@ -138,6 +138,12 @@ void WebNotification::dispatchCloseEvent(bool /* byUser */) m_private->dispatchEvent(event.release()); } +void WebNotification::dispatchClickEvent() +{ + 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/WebRuntimeFeatures.cpp b/WebKit/chromium/src/WebRuntimeFeatures.cpp index 9e21d58..2279eeb 100644 --- a/WebKit/chromium/src/WebRuntimeFeatures.cpp +++ b/WebKit/chromium/src/WebRuntimeFeatures.cpp @@ -256,4 +256,36 @@ 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 +} + } // namespace WebKit diff --git a/WebKit/chromium/src/WebScrollbarImpl.cpp b/WebKit/chromium/src/WebScrollbarImpl.cpp index 8bf5340..c0131cb 100644 --- a/WebKit/chromium/src/WebScrollbarImpl.cpp +++ b/WebKit/chromium/src/WebScrollbarImpl.cpp @@ -81,7 +81,7 @@ void WebScrollbarImpl::setLocation(const WebRect& rect) m_scrollbar->invalidate(); int length = m_scrollbar->orientation() == HorizontalScrollbar ? m_scrollbar->width() : m_scrollbar->height(); - int pageStep = max(max<int>(length * Scrollbar::minFractionToStepWhenPaging(), length - Scrollbar::maxOverlapBetweenPages()), 1); + 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()); @@ -214,7 +214,7 @@ bool WebScrollbarImpl::onMouseWheel(const WebInputEvent& event) if (mousewheel.scrollByPage) { ASSERT(m_scrollbar->orientation() == VerticalScrollbar); bool negative = delta < 0; - delta = max(max<int>(m_scrollbar->visibleSize() * Scrollbar::minFractionToStepWhenPaging(), m_scrollbar->visibleSize() - Scrollbar::maxOverlapBetweenPages()), 1); + 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; } diff --git a/WebKit/chromium/src/WebSearchableFormData.cpp b/WebKit/chromium/src/WebSearchableFormData.cpp index 14ece13..1864514 100644 --- a/WebKit/chromium/src/WebSearchableFormData.cpp +++ b/WebKit/chromium/src/WebSearchableFormData.cpp @@ -187,7 +187,7 @@ bool HasSuitableTextElement(const HTMLFormElement* form, Vector<char>* encodedSt if (!formElement->appendFormData(dataList, false)) continue; - const BlobItemList& items = dataList.items(); + 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. @@ -196,22 +196,20 @@ bool HasSuitableTextElement(const HTMLFormElement* form, Vector<char>* encodedSt } textElement = static_cast<HTMLInputElement*>(formElement); } - for (BlobItemList::const_iterator j(items.begin()); j != items.end(); ++j) { - const StringBlobItem* item = (*j)->toStringBlobItem(); - ASSERT(item); + 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() || item->cstr() != "isindex") { + if (!encodedString->isEmpty() || j->data() != "isindex") { if (!encodedString->isEmpty()) encodedString->append('&'); - FormDataBuilder::encodeStringAsFormData(*encodedString, item->cstr()); + FormDataBuilder::encodeStringAsFormData(*encodedString, j->data()); encodedString->append('='); } ++j; if (formElement == textElement) encodedString->append("{searchTerms}", 13); else - FormDataBuilder::encodeStringAsFormData(*encodedString, item->cstr()); + FormDataBuilder::encodeStringAsFormData(*encodedString, j->data()); } } diff --git a/WebKit/chromium/src/WebViewImpl.cpp b/WebKit/chromium/src/WebViewImpl.cpp index 383b716..4b129d6 100644 --- a/WebKit/chromium/src/WebViewImpl.cpp +++ b/WebKit/chromium/src/WebViewImpl.cpp @@ -823,13 +823,10 @@ 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; @@ -2120,9 +2117,13 @@ void WebViewImpl::setIsAcceleratedCompositingActive(bool active) if (active) { m_layerRenderer = LayerRendererChromium::create(getOnscreenGLES2Context()); - if (m_layerRenderer->hardwareCompositing()) + if (m_layerRenderer->hardwareCompositing()) { m_isAcceleratedCompositingActive = true; - else { + + // Force a redraw the entire view so that the compositor gets the entire view, + // rather than just the currently-dirty subset. + m_client->didInvalidateRect(IntRect(0, 0, m_size.width, m_size.height)); + } else { m_layerRenderer.clear(); m_isAcceleratedCompositingActive = false; } diff --git a/WebKit/chromium/src/js/DevTools.js b/WebKit/chromium/src/js/DevTools.js index e3e0204..f55be4e 100644 --- a/WebKit/chromium/src/js/DevTools.js +++ b/WebKit/chromium/src/js/DevTools.js @@ -34,39 +34,10 @@ * DevTools frontend together. It is also responsible for overriding existing * WebInspector functionality while it is getting upstreamed into WebCore. */ -devtools.ToolsAgent = function() -{ - this.profilerAgent_ = new devtools.ProfilerAgent(); -}; - - -/** - * @return {devtools.ProfilerAgent} Profiler agent instance. - */ -devtools.ToolsAgent.prototype.getProfilerAgent = function() -{ - return this.profilerAgent_; -}; - - - -/** - * 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(); - +(function () { Preferences.ignoreWhitespace = false; Preferences.samplingCPUProfiler = true; Preferences.heapProfilerPresent = true; @@ -75,9 +46,9 @@ WebInspector.loaded = function() Preferences.canEditScriptSource = true; Preferences.onlineDetectionEnabled = false; Preferences.domBreakpointsEnabled = true; +})(); - oldLoaded.call(WebInspector); -} +var devtools = devtools || {}; devtools.domContentLoaded = function() { @@ -88,12 +59,12 @@ devtools.domContentLoaded = function() 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 diff --git a/WebKit/chromium/src/js/HeapProfilerPanel.js b/WebKit/chromium/src/js/HeapProfilerPanel.js deleted file mode 100644 index bcb008f..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.trim(); - - 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() - { - devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT); - }, - - get welcomeMessage() - { - return WebInspector.UIString("Get a heap snapshot by pressing 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/ProfilerAgent.js b/WebKit/chromium/src/js/ProfilerAgent.js deleted file mode 100644 index 7f74595..0000000 --- a/WebKit/chromium/src/js/ProfilerAgent.js +++ /dev/null @@ -1,138 +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() -{ - - /** - * Profiler log position. - * @type {number} - */ - this._logPosition = 0; - - /** - * Last requested log position. - * @type {number} - */ - this._lastRequestedLogPosition = -1; - - /** - * 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 -}; - - -/** - * Initializes profiling state. - */ -devtools.ProfilerAgent.prototype.initializeProfiling = function() -{ - this._getNextLogLines(false); -}; - - -/** - * 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; - - var callId = WebInspector.Callback.wrap(this._didGetProfilerLogLines.bind(this)); - if (immediately) - InspectorBackend.getProfilerLogLines(callId, pos); - else { - function delayedRequest() - { - InspectorBackend.getProfilerLogLines(callId, pos); - } - setTimeout(delayedRequest, 500); - } -}; - - -/** - * Starts profiling. - * @param {number} modules List of modules to enable. - */ -devtools.ProfilerAgent.prototype.startProfiling = function(modules) -{ - if (modules & devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT) { - InspectorBackend.takeHeapSnapshot(); - // Active modules will not change, instead, a snapshot will be logged. - this._getNextLogLines(); - } -}; - - -/** - * 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._didGetProfilerLogLines = function(pos, log) -{ - this._logPosition = pos; - if (log.length > 0) { - this._profilerProcessor.processLogChunk(log); - this._getNextLogLines(); - } else { - // Allow re-reading from the last position. - this._lastRequestedLogPosition = this._logPosition - 1; - } -}; - -WebInspector.didGetProfilerLogLines = WebInspector.Callback.processCallback; diff --git a/WebKit/chromium/src/js/ProfilerProcessor.js b/WebKit/chromium/src/js/ProfilerProcessor.js deleted file mode 100644 index 61714e8..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) -{ - WebInspector.log(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/devTools.css b/WebKit/chromium/src/js/devTools.css index dfcaadf..9495fb8 100755 --- a/WebKit/chromium/src/js/devTools.css +++ b/WebKit/chromium/src/js/devTools.css @@ -37,118 +37,6 @@ body.platform-linux #scripts-files { line-height: 12px; } -/* 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; -} - -#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; -} - -.heap-snapshot-summary { - display: inline-block; - width: 50%; - min-width: 300px; - position: relative; -} - -.heap-snapshot-summary canvas.summary-graph { - width: 225px; -} - -.heap-snapshot-summary-label { - font-size: 12px; - font-weight: bold; - position: absolute; - top: 1px; - width: 50%; - left: 25%; -} - .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))); diff --git a/WebKit/chromium/src/win/WebInputEventFactory.cpp b/WebKit/chromium/src/win/WebInputEventFactory.cpp index a5bd935..4d83f22 100644 --- a/WebKit/chromium/src/win/WebInputEventFactory.cpp +++ b/WebKit/chromium/src/win/WebInputEventFactory.cpp @@ -398,11 +398,11 @@ 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). static const float scrollbarPixelsPerLine = 100.0f / 3.0f; wheelDelta /= WHEEL_DELTA; float scrollDelta = wheelDelta; |