Index: sky/engine/web/WebLocalFrameImpl.cpp |
diff --git a/sky/engine/web/WebLocalFrameImpl.cpp b/sky/engine/web/WebLocalFrameImpl.cpp |
deleted file mode 100644 |
index ff29d93291589ee3c21c4626a3d15ae4fc5c96f1..0000000000000000000000000000000000000000 |
--- a/sky/engine/web/WebLocalFrameImpl.cpp |
+++ /dev/null |
@@ -1,618 +0,0 @@ |
-/* |
- * Copyright (C) 2009 Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are |
- * met: |
- * |
- * * Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * * Redistributions in binary form must reproduce the above |
- * copyright notice, this list of conditions and the following disclaimer |
- * in the documentation and/or other materials provided with the |
- * distribution. |
- * * Neither the name of Google Inc. nor the names of its |
- * contributors may be used to endorse or promote products derived from |
- * this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-// How ownership works |
-// ------------------- |
-// |
-// Big oh represents a refcounted relationship: owner O--- ownee |
-// |
-// WebView (for the toplevel frame only) |
-// O |
-// | WebFrame |
-// | O |
-// | | |
-// Page O------- LocalFrame (m_mainFrame) O-------O FrameView |
-// || |
-// || |
-// FrameLoader |
-// |
-// FrameLoader and LocalFrame are formerly one object that was split apart because |
-// it got too big. They basically have the same lifetime, hence the double line. |
-// |
-// From the perspective of the embedder, WebFrame is simply an object that it |
-// allocates by calling WebFrame::create() and must be freed by calling close(). |
-// Internally, WebFrame is actually refcounted and it holds a reference to its |
-// corresponding LocalFrame in WebCore. |
-// |
-// How frames are destroyed |
-// ------------------------ |
-// |
-// The main frame is never destroyed and is re-used. The FrameLoader is re-used |
-// and a reference to the main frame is kept by the Page. |
-// |
-// When frame content is replaced, all subframes are destroyed. This happens |
-// in FrameLoader::detachFromParent for each subframe in a pre-order depth-first |
-// traversal. Note that child node order may not match DOM node order! |
-// detachFromParent() calls FrameLoaderClient::detachedFromParent(), which calls |
-// WebFrame::frameDetached(). This triggers WebFrame to clear its reference to |
-// LocalFrame, and also notifies the embedder via WebFrameClient that the frame is |
-// detached. Most embedders will invoke close() on the WebFrame at this point, |
-// triggering its deletion unless something else is still retaining a reference. |
-// |
-// Thie client is expected to be set whenever the WebLocalFrameImpl is attached to |
-// the DOM. |
- |
-#include "sky/engine/web/WebLocalFrameImpl.h" |
- |
-#include <algorithm> |
-#include "base/strings/stringprintf.h" |
-#include "mojo/common/data_pipe_utils.h" |
-#include "mojo/public/cpp/system/data_pipe.h" |
-#include "sky/engine/bindings/exception_state.h" |
-#include "sky/engine/bindings/exception_state_placeholder.h" |
-#include "sky/engine/core/dom/Document.h" |
-#include "sky/engine/core/dom/Node.h" |
-#include "sky/engine/core/dom/NodeTraversal.h" |
-#include "sky/engine/core/dom/shadow/ShadowRoot.h" |
-#include "sky/engine/core/editing/Editor.h" |
-#include "sky/engine/core/editing/FrameSelection.h" |
-#include "sky/engine/core/editing/htmlediting.h" |
-#include "sky/engine/core/editing/InputMethodController.h" |
-#include "sky/engine/core/editing/PlainTextRange.h" |
-#include "sky/engine/core/editing/SpellChecker.h" |
-#include "sky/engine/core/editing/TextAffinity.h" |
-#include "sky/engine/core/editing/TextIterator.h" |
-#include "sky/engine/core/frame/FrameHost.h" |
-#include "sky/engine/core/frame/FrameView.h" |
-#include "sky/engine/core/frame/LocalDOMWindow.h" |
-#include "sky/engine/core/frame/Settings.h" |
-#include "sky/engine/core/html/HTMLAnchorElement.h" |
-#include "sky/engine/core/inspector/ConsoleMessage.h" |
-#include "sky/engine/core/loader/MojoLoader.h" |
-#include "sky/engine/core/page/EventHandler.h" |
-#include "sky/engine/core/page/FocusController.h" |
-#include "sky/engine/core/page/Page.h" |
-#include "sky/engine/core/rendering/HitTestResult.h" |
-#include "sky/engine/core/rendering/RenderBox.h" |
-#include "sky/engine/core/rendering/RenderLayer.h" |
-#include "sky/engine/core/rendering/RenderObject.h" |
-#include "sky/engine/core/rendering/RenderTreeAsText.h" |
-#include "sky/engine/core/rendering/RenderView.h" |
-#include "sky/engine/core/rendering/style/StyleInheritedData.h" |
-#include "sky/engine/platform/clipboard/ClipboardUtilities.h" |
-#include "sky/engine/platform/fonts/FontCache.h" |
-#include "sky/engine/platform/graphics/GraphicsContext.h" |
-#include "sky/engine/platform/graphics/skia/SkiaUtils.h" |
-#include "sky/engine/platform/heap/Handle.h" |
-#include "sky/engine/platform/network/ResourceRequest.h" |
-#include "sky/engine/platform/TraceEvent.h" |
-#include "sky/engine/platform/weborigin/KURL.h" |
-#include "sky/engine/platform/weborigin/SecurityPolicy.h" |
-#include "sky/engine/public/platform/Platform.h" |
-#include "sky/engine/public/platform/WebFloatPoint.h" |
-#include "sky/engine/public/platform/WebFloatRect.h" |
-#include "sky/engine/public/platform/WebLayer.h" |
-#include "sky/engine/public/platform/WebPoint.h" |
-#include "sky/engine/public/platform/WebRect.h" |
-#include "sky/engine/public/platform/WebSize.h" |
-#include "sky/engine/public/platform/WebURLError.h" |
-#include "sky/engine/public/platform/WebVector.h" |
-#include "sky/engine/public/web/WebConsoleMessage.h" |
-#include "sky/engine/public/web/WebDocument.h" |
-#include "sky/engine/public/web/WebElement.h" |
-#include "sky/engine/public/web/WebFrameClient.h" |
-#include "sky/engine/public/web/WebNode.h" |
-#include "sky/engine/public/web/WebRange.h" |
-#include "sky/engine/public/web/WebScriptSource.h" |
-#include "sky/engine/web/CompositionUnderlineVectorBuilder.h" |
-#include "sky/engine/web/WebViewImpl.h" |
-#include "sky/engine/wtf/CurrentTime.h" |
-#include "sky/engine/wtf/HashMap.h" |
- |
-namespace blink { |
- |
-static int frameCount = 0; |
- |
-// Key for a StatsCounter tracking how many WebFrames are active. |
-static const char webFrameActiveCount[] = "WebFrameActiveCount"; |
- |
-static void frameContentAsPlainText(size_t maxChars, LocalFrame* frame, StringBuilder& output) |
-{ |
- Document* document = frame->document(); |
- if (!document) |
- return; |
- |
- if (!frame->view()) |
- return; |
- |
- // Select the document body. |
- RefPtr<Range> range(document->createRange()); |
- TrackExceptionState exceptionState; |
- range->selectNodeContents(document, exceptionState); |
- |
- if (!exceptionState.had_exception()) { |
- // The text iterator will walk nodes giving us text. This is similar to |
- // the plainText() function in core/editing/TextIterator.h, but we implement the maximum |
- // size and also copy the results directly into a wstring, avoiding the |
- // string conversion. |
- for (TextIterator it(range.get()); !it.atEnd(); it.advance()) { |
- it.appendTextToStringBuilder(output, 0, maxChars - output.length()); |
- if (output.length() >= maxChars) |
- return; // Filled up the buffer. |
- } |
- } |
-} |
- |
-// WebFrame ------------------------------------------------------------------- |
- |
-int WebFrame::instanceCount() |
-{ |
- return frameCount; |
-} |
- |
-bool WebLocalFrameImpl::isWebLocalFrame() const |
-{ |
- return true; |
-} |
- |
-WebLocalFrame* WebLocalFrameImpl::toWebLocalFrame() |
-{ |
- return this; |
-} |
- |
-void WebLocalFrameImpl::close() |
-{ |
- m_client = 0; |
- |
- deref(); // Balances ref() acquired in WebFrame::create |
-} |
- |
-WebSize WebLocalFrameImpl::contentsSize() const |
-{ |
- return frame()->view()->size(); |
-} |
- |
-bool WebLocalFrameImpl::hasVisibleContent() const |
-{ |
- return frame()->view()->width() > 0 && frame()->view()->height() > 0; |
-} |
- |
-WebRect WebLocalFrameImpl::visibleContentRect() const |
-{ |
- return frame()->view()->frameRect(); |
-} |
- |
-WebView* WebLocalFrameImpl::view() const |
-{ |
- return viewImpl(); |
-} |
- |
-WebDocument WebLocalFrameImpl::document() const |
-{ |
- if (!frame() || !frame()->document()) |
- return WebDocument(); |
- return WebDocument(frame()->document()); |
-} |
- |
-void WebLocalFrameImpl::executeScript(const WebScriptSource& source) |
-{ |
- ASSERT(frame()); |
- // TODO(dart) |
-} |
- |
-void WebLocalFrameImpl::addMessageToConsole(const WebConsoleMessage& message) |
-{ |
- ASSERT(frame()); |
- |
- MessageLevel webCoreMessageLevel; |
- switch (message.level) { |
- case WebConsoleMessage::LevelDebug: |
- webCoreMessageLevel = DebugMessageLevel; |
- break; |
- case WebConsoleMessage::LevelLog: |
- webCoreMessageLevel = LogMessageLevel; |
- break; |
- case WebConsoleMessage::LevelWarning: |
- webCoreMessageLevel = WarningMessageLevel; |
- break; |
- case WebConsoleMessage::LevelError: |
- webCoreMessageLevel = ErrorMessageLevel; |
- break; |
- default: |
- ASSERT_NOT_REACHED(); |
- return; |
- } |
- |
- frame()->document()->addConsoleMessage(ConsoleMessage::create(OtherMessageSource, webCoreMessageLevel, message.text)); |
-} |
- |
-void WebLocalFrameImpl::collectGarbage() |
-{ |
- // TODO(dart): Implement. |
-} |
- |
-void WebLocalFrameImpl::loadFromDataPipeWithURL(mojo::ScopedDataPipeConsumerHandle responseStream, const WebURL& url) |
-{ |
- frame()->mojoLoader().init(url); |
- frame()->mojoLoader().parse(responseStream.Pass()); |
-} |
- |
-void WebLocalFrameImpl::load(const WebURL& url) |
-{ |
- frame()->mojoLoader().init(url); |
- m_fetcher = adoptPtr(new MojoFetcher(this, url)); |
-} |
- |
-void WebLocalFrameImpl::OnReceivedResponse(mojo::URLResponsePtr response) |
-{ |
- m_fetcher.clear(); |
- if (response->body.is_valid()) { |
- frame()->mojoLoader().parse(response->body.Pass()); |
- return; |
- } |
- LOG(ERROR) << "Response for " << response->url |
- << " (status " << response->status_code << ") has no body."; |
- |
- // TODO(eseidel): This is a hack, but makes debugging way easier. |
- mojo::DataPipe pipe; |
- frame()->mojoLoader().parse(pipe.consumer_handle.Pass()); |
- std::string error_response = base::StringPrintf( |
- "<error><h style='display: paragraph'>Empty Body</h>" |
- "<l style='display: paragraph'>%d %s</l>" |
- "<m style='display: paragraph'>%s</m></t></error>", |
- response->status_code, response->status_line.get().c_str(), |
- response->error->description.get().c_str()); |
- |
- uint32_t length = error_response.length(); |
- MojoWriteData(pipe.producer_handle.get().value(), |
- error_response.data(), |
- &length, |
- MOJO_WRITE_DATA_FLAG_ALL_OR_NONE); |
-} |
- |
-void WebLocalFrameImpl::replaceSelection(const WebString& text) |
-{ |
- bool selectReplacement = false; |
- bool smartReplace = true; |
- frame()->editor().replaceSelectionWithText(text, selectReplacement, smartReplace); |
-} |
- |
-void WebLocalFrameImpl::insertText(const WebString& text) |
-{ |
- if (frame()->inputMethodController().hasComposition()) |
- frame()->inputMethodController().confirmComposition(text); |
- else |
- frame()->editor().insertText(text, 0); |
-} |
- |
-void WebLocalFrameImpl::setMarkedText(const WebString& text, unsigned location, unsigned length) |
-{ |
- Vector<CompositionUnderline> decorations; |
- frame()->inputMethodController().setComposition(text, decorations, location, length); |
-} |
- |
-void WebLocalFrameImpl::unmarkText() |
-{ |
- frame()->inputMethodController().cancelComposition(); |
-} |
- |
-bool WebLocalFrameImpl::hasMarkedText() const |
-{ |
- return frame()->inputMethodController().hasComposition(); |
-} |
- |
-bool WebLocalFrameImpl::executeCommand(const WebString& name, const WebNode& node) |
-{ |
- ASSERT(frame()); |
- |
- if (name.length() <= 2) |
- return false; |
- |
- // Since we don't have NSControl, we will convert the format of command |
- // string and call the function on Editor directly. |
- String command = name; |
- |
- // Make sure the first letter is upper case. |
- command.replace(0, 1, command.substring(0, 1).upper()); |
- |
- // Remove the trailing ':' if existing. |
- if (command[command.length() - 1] == UChar(':')) |
- command = command.substring(0, command.length() - 1); |
- |
- return frame()->editor().executeCommand(command); |
-} |
- |
-bool WebLocalFrameImpl::executeCommand(const WebString& name, const WebString& value, const WebNode& node) |
-{ |
- ASSERT(frame()); |
- |
- return frame()->editor().executeCommand(name, value); |
-} |
- |
-bool WebLocalFrameImpl::isCommandEnabled(const WebString& name) const |
-{ |
- ASSERT(frame()); |
- return frame()->editor().command(name).isEnabled(); |
-} |
- |
-void WebLocalFrameImpl::enableContinuousSpellChecking(bool enable) |
-{ |
- if (enable == isContinuousSpellCheckingEnabled()) |
- return; |
- frame()->spellChecker().toggleContinuousSpellChecking(); |
-} |
- |
-bool WebLocalFrameImpl::isContinuousSpellCheckingEnabled() const |
-{ |
- return frame()->spellChecker().isContinuousSpellCheckingEnabled(); |
-} |
- |
-void WebLocalFrameImpl::requestTextChecking(const WebElement& webElement) |
-{ |
- if (webElement.isNull()) |
- return; |
- frame()->spellChecker().requestTextChecking(*webElement.constUnwrap<Element>()); |
-} |
- |
-void WebLocalFrameImpl::replaceMisspelledRange(const WebString& text) |
-{ |
- frame()->spellChecker().replaceMisspelledRange(text); |
-} |
- |
-void WebLocalFrameImpl::removeSpellingMarkers() |
-{ |
- frame()->spellChecker().removeSpellingMarkers(); |
-} |
- |
-bool WebLocalFrameImpl::hasSelection() const |
-{ |
- // frame()->selection()->isNone() never returns true. |
- return frame()->selection().start() != frame()->selection().end(); |
-} |
- |
-WebRange WebLocalFrameImpl::selectionRange() const |
-{ |
- return frame()->selection().toNormalizedRange(); |
-} |
- |
-WebString WebLocalFrameImpl::selectionAsText() const |
-{ |
- RefPtr<Range> range = frame()->selection().toNormalizedRange(); |
- if (!range) |
- return WebString(); |
- |
- String text = range->text(); |
- replaceNBSPWithSpace(text); |
- return text; |
-} |
- |
-void WebLocalFrameImpl::selectWordAroundPosition(LocalFrame* frame, VisiblePosition position) |
-{ |
- VisibleSelection selection(position); |
- selection.expandUsingGranularity(WordGranularity); |
- |
- TextGranularity granularity = selection.isRange() ? WordGranularity : CharacterGranularity; |
- frame->selection().setSelection(selection, granularity); |
-} |
- |
-bool WebLocalFrameImpl::selectWordAroundCaret() |
-{ |
- FrameSelection& selection = frame()->selection(); |
- if (selection.isNone() || selection.isRange()) |
- return false; |
- selectWordAroundPosition(frame(), selection.selection().visibleStart()); |
- return true; |
-} |
- |
-void WebLocalFrameImpl::selectRange(const WebPoint& base, const WebPoint& extent) |
-{ |
- moveRangeSelection(base, extent); |
-} |
- |
-void WebLocalFrameImpl::selectRange(const WebRange& webRange) |
-{ |
- if (RefPtr<Range> range = static_cast<PassRefPtr<Range> >(webRange)) |
- frame()->selection().setSelectedRange(range.get(), VP_DEFAULT_AFFINITY, FrameSelection::NonDirectional, NotUserTriggered); |
-} |
- |
-void WebLocalFrameImpl::moveRangeSelection(const WebPoint& base, const WebPoint& extent) |
-{ |
- VisiblePosition basePosition = visiblePositionForWindowPoint(base); |
- VisiblePosition extentPosition = visiblePositionForWindowPoint(extent); |
- VisibleSelection newSelection = VisibleSelection(basePosition, extentPosition); |
- frame()->selection().setSelection(newSelection, CharacterGranularity); |
-} |
- |
-void WebLocalFrameImpl::moveCaretSelection(const WebPoint& point) |
-{ |
- Element* editable = frame()->selection().rootEditableElement(); |
- if (!editable) |
- return; |
- |
- VisiblePosition position = visiblePositionForWindowPoint(point); |
- frame()->selection().moveTo(position, UserTriggered); |
-} |
- |
-bool WebLocalFrameImpl::setEditableSelectionOffsets(int start, int end) |
-{ |
- return frame()->inputMethodController().setEditableSelectionOffsets(PlainTextRange(start, end)); |
-} |
- |
-bool WebLocalFrameImpl::setCompositionFromExistingText(int compositionStart, int compositionEnd, const WebVector<WebCompositionUnderline>& underlines) |
-{ |
- if (!frame()->editor().canEdit()) |
- return false; |
- |
- InputMethodController& inputMethodController = frame()->inputMethodController(); |
- inputMethodController.cancelComposition(); |
- |
- if (compositionStart == compositionEnd) |
- return true; |
- |
- inputMethodController.setCompositionFromExistingText(CompositionUnderlineVectorBuilder(underlines), compositionStart, compositionEnd); |
- |
- return true; |
-} |
- |
-void WebLocalFrameImpl::extendSelectionAndDelete(int before, int after) |
-{ |
- frame()->inputMethodController().extendSelectionAndDelete(before, after); |
-} |
- |
-void WebLocalFrameImpl::setCaretVisible(bool visible) |
-{ |
- frame()->selection().setCaretVisible(visible); |
-} |
- |
-VisiblePosition WebLocalFrameImpl::visiblePositionForWindowPoint(const WebPoint& point) |
-{ |
- HitTestRequest request = HitTestRequest::Move | HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::IgnoreClipping; |
- HitTestResult result(frame()->view()->windowToContents(roundedIntPoint(FloatPoint(point)))); |
- frame()->document()->renderView()->hitTest(request, result.hitTestLocation(), result); |
- |
- if (Node* node = result.targetNode()) |
- return frame()->selection().selection().visiblePositionRespectingEditingBoundary(result.localPoint(), node); |
- return VisiblePosition(); |
-} |
- |
-WebString WebLocalFrameImpl::contentAsText(size_t maxChars) const |
-{ |
- if (!frame()) |
- return WebString(); |
- StringBuilder text; |
- frameContentAsPlainText(maxChars, frame(), text); |
- return text.toString(); |
-} |
- |
-WebString WebLocalFrameImpl::renderTreeAsText(RenderAsTextControls toShow) const |
-{ |
- RenderAsTextBehavior behavior = RenderAsTextBehaviorNormal; |
- |
- if (toShow & RenderAsTextDebug) |
- behavior |= RenderAsTextShowCompositedLayers | RenderAsTextShowAddresses | RenderAsTextShowIDAndClass | RenderAsTextShowLayerNesting; |
- |
- return externalRepresentation(frame(), behavior); |
-} |
- |
-bool WebLocalFrameImpl::selectionStartHasSpellingMarkerFor(int from, int length) const |
-{ |
- if (!frame()) |
- return false; |
- return frame()->spellChecker().selectionStartHasSpellingMarkerFor(from, length); |
-} |
- |
-// WebLocalFrameImpl public --------------------------------------------------------- |
- |
-WebLocalFrame* WebLocalFrame::create(WebFrameClient* client) |
-{ |
- return WebLocalFrameImpl::create(client); |
-} |
- |
-WebLocalFrameImpl* WebLocalFrameImpl::create(WebFrameClient* client) |
-{ |
- return adoptRef(new WebLocalFrameImpl(client)).leakRef(); |
-} |
- |
-WebLocalFrameImpl::WebLocalFrameImpl(WebFrameClient* client) |
- : m_frameLoaderClientImpl(this) |
- , m_client(client) |
- , m_inputEventsScaleFactorForEmulation(1) |
-{ |
- Platform::current()->incrementStatsCounter(webFrameActiveCount); |
- frameCount++; |
-} |
- |
-WebLocalFrameImpl::~WebLocalFrameImpl() |
-{ |
- Platform::current()->decrementStatsCounter(webFrameActiveCount); |
- frameCount--; |
-} |
- |
-void WebLocalFrameImpl::setCoreFrame(PassRefPtr<LocalFrame> frame) |
-{ |
- m_frame = frame; |
-} |
- |
-PassRefPtr<LocalFrame> WebLocalFrameImpl::initializeCoreFrame(FrameHost* host) |
-{ |
- RefPtr<LocalFrame> frame = LocalFrame::create(&m_frameLoaderClientImpl, host); |
- setCoreFrame(frame); |
- return frame; |
-} |
- |
-void WebLocalFrameImpl::createFrameView() |
-{ |
- TRACE_EVENT0("blink", "WebLocalFrameImpl::createFrameView"); |
- |
- ASSERT(frame()); // If frame() doesn't exist, we probably didn't init properly. |
- |
- WebViewImpl* webView = viewImpl(); |
- frame()->createView(webView->size(), webView->baseBackgroundColor(), webView->isTransparent()); |
- frame()->view()->setInputEventsTransformForEmulation(m_inputEventsOffsetForEmulation, m_inputEventsScaleFactorForEmulation); |
-} |
- |
-WebLocalFrameImpl* WebLocalFrameImpl::fromFrame(LocalFrame* frame) |
-{ |
- if (!frame) |
- return 0; |
- return fromFrame(*frame); |
-} |
- |
-WebLocalFrameImpl* WebLocalFrameImpl::fromFrame(LocalFrame& frame) |
-{ |
- FrameLoaderClient* client = frame.loaderClient(); |
- if (!client || !client->isFrameLoaderClientImpl()) |
- return 0; |
- return toFrameLoaderClientImpl(client)->webFrame(); |
-} |
- |
-WebViewImpl* WebLocalFrameImpl::viewImpl() const |
-{ |
- if (!frame()) |
- return 0; |
- return WebViewImpl::fromPage(frame()->page()); |
-} |
- |
-void WebLocalFrameImpl::didFail(const ResourceError& error) |
-{ |
- if (!client()) |
- return; |
- client()->didFailLoad(this, error); |
-} |
- |
-void WebLocalFrameImpl::setInputEventsTransformForEmulation(const IntSize& offset, float contentScaleFactor) |
-{ |
- m_inputEventsOffsetForEmulation = offset; |
- m_inputEventsScaleFactorForEmulation = contentScaleFactor; |
- if (frame()->view()) |
- frame()->view()->setInputEventsTransformForEmulation(m_inputEventsOffsetForEmulation, m_inputEventsScaleFactorForEmulation); |
-} |
- |
-} // namespace blink |