1 /*
2 * Copyright (C) 2006 Zack Rusin <zack@kde.org>
3 * Copyright (C) 2006, 2011 Apple Inc. All rights reserved.
4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
5 * Copyright (C) 2008 Collabora Ltd. All rights reserved.
6 * Copyright (C) 2008 Holger Hans Peter Freyther
7 * Copyright (C) 2008 Kenneth Rohde Christiansen
8 * Copyright (C) 2009-2010 ProFUSION embedded systems
9 * Copyright (C) 2009-2010 Samsung Electronics
10 *
11 * All rights reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 *
22 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
23 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
26 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
30 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35 #include "config.h"
36 #include "FrameLoaderClientEfl.h"
37
38 #include "DocumentLoader.h"
39 #include "EWebKit.h"
40 #include "FormState.h"
41 #include "FrameLoader.h"
42 #include "FrameNetworkingContextEfl.h"
43 #include "FrameTree.h"
44 #include "FrameView.h"
45 #include "HTMLFormElement.h"
46 #include "MIMETypeRegistry.h"
47 #include "NotImplemented.h"
48 #include "Page.h"
49 #include "PluginDatabase.h"
50 #include "ProgressTracker.h"
51 #include "RenderPart.h"
52 #include "ResourceRequest.h"
53 #include "WebKitVersion.h"
54 #include "ewk_private.h"
55 #include <wtf/text/CString.h>
56 #include <wtf/text/StringConcatenate.h>
57
58 #if OS(UNIX)
59 #include <sys/utsname.h>
60 #elif OS(WINDOWS)
61 #include "SystemInfo.h"
62 #endif
63
64 #include <Ecore_Evas.h>
65
66 using namespace WebCore;
67
68 namespace WebCore {
69
FrameLoaderClientEfl(Evas_Object * view)70 FrameLoaderClientEfl::FrameLoaderClientEfl(Evas_Object *view)
71 : m_view(view)
72 , m_frame(0)
73 , m_userAgent("")
74 , m_customUserAgent("")
75 , m_pluginView(0)
76 , m_hasSentResponseToPlugin(false)
77 {
78 }
79
agentOS()80 static String agentOS()
81 {
82 #if OS(DARWIN)
83 #if CPU(X86)
84 return "Intel Mac OS X";
85 #else
86 return "PPC Mac OS X";
87 #endif
88 #elif OS(UNIX)
89 struct utsname name;
90 if (uname(&name) != -1)
91 return makeString(name.sysname, ' ', name.machine);
92
93 return "Unknown";
94 #elif OS(WINDOWS)
95 return windowsVersionForUAString();
96 #else
97 notImplemented();
98 return "Unknown";
99 #endif
100 }
101
composeUserAgent()102 static String composeUserAgent()
103 {
104 String webKitVersion = String::format("%d.%d", WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION);
105 return makeString("Mozilla/5.0 (", agentOS(), ") AppleWebKit/", webKitVersion, " (KHTML, like Gecko) Safari/", webKitVersion);
106 }
107
setCustomUserAgent(const String & agent)108 void FrameLoaderClientEfl::setCustomUserAgent(const String &agent)
109 {
110 m_customUserAgent = agent;
111 }
112
customUserAgent() const113 const String& FrameLoaderClientEfl::customUserAgent() const
114 {
115 return m_customUserAgent;
116 }
117
userAgent(const KURL &)118 String FrameLoaderClientEfl::userAgent(const KURL&)
119 {
120 if (!m_customUserAgent.isEmpty())
121 return m_customUserAgent;
122
123 if (m_userAgent.isEmpty())
124 m_userAgent = composeUserAgent();
125 return m_userAgent;
126 }
127
callPolicyFunction(FramePolicyFunction function,PolicyAction action)128 void FrameLoaderClientEfl::callPolicyFunction(FramePolicyFunction function, PolicyAction action)
129 {
130 Frame* f = ewk_frame_core_get(m_frame);
131 ASSERT(f);
132 (f->loader()->policyChecker()->*function)(action);
133 }
134
createDocumentLoader(const ResourceRequest & request,const SubstituteData & substituteData)135 WTF::PassRefPtr<DocumentLoader> FrameLoaderClientEfl::createDocumentLoader(const ResourceRequest& request, const SubstituteData& substituteData)
136 {
137 RefPtr<DocumentLoader> loader = DocumentLoader::create(request, substituteData);
138 if (substituteData.isValid())
139 loader->setDeferMainResourceDataLoad(false);
140 return loader.release();
141 }
142
dispatchWillSubmitForm(FramePolicyFunction function,PassRefPtr<FormState>)143 void FrameLoaderClientEfl::dispatchWillSubmitForm(FramePolicyFunction function, PassRefPtr<FormState>)
144 {
145 // FIXME: This is surely too simple
146 ASSERT(function);
147 callPolicyFunction(function, PolicyUse);
148 }
149
committedLoad(DocumentLoader * loader,const char * data,int length)150 void FrameLoaderClientEfl::committedLoad(DocumentLoader* loader, const char* data, int length)
151 {
152 if (!m_pluginView)
153 loader->commitData(data, length);
154
155 // We re-check here as the plugin can have been created
156 if (m_pluginView) {
157 if (!m_hasSentResponseToPlugin) {
158 m_pluginView->didReceiveResponse(loader->response());
159 m_hasSentResponseToPlugin = true;
160 }
161 m_pluginView->didReceiveData(data, length);
162 }
163 }
164
dispatchDidReplaceStateWithinPage()165 void FrameLoaderClientEfl::dispatchDidReplaceStateWithinPage()
166 {
167 notImplemented();
168 }
169
dispatchDidRemoveBackForwardItem(WebCore::HistoryItem *) const170 void FrameLoaderClientEfl::dispatchDidRemoveBackForwardItem(WebCore::HistoryItem*) const
171 {
172 notImplemented();
173 }
174
dispatchDidPushStateWithinPage()175 void FrameLoaderClientEfl::dispatchDidPushStateWithinPage()
176 {
177 notImplemented();
178 }
179
dispatchDidPopStateWithinPage()180 void FrameLoaderClientEfl::dispatchDidPopStateWithinPage()
181 {
182 notImplemented();
183 }
184
dispatchDidChangeBackForwardIndex() const185 void FrameLoaderClientEfl::dispatchDidChangeBackForwardIndex() const
186 {
187 notImplemented();
188 }
189
dispatchDidAddBackForwardItem(WebCore::HistoryItem *) const190 void FrameLoaderClientEfl::dispatchDidAddBackForwardItem(WebCore::HistoryItem*) const
191 {
192 notImplemented();
193 }
194
dispatchDidClearWindowObjectInWorld(DOMWrapperWorld *)195 void FrameLoaderClientEfl::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld*)
196 {
197 notImplemented();
198 }
199
dispatchDidReceiveAuthenticationChallenge(DocumentLoader *,unsigned long identifier,const AuthenticationChallenge &)200 void FrameLoaderClientEfl::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&)
201 {
202 notImplemented();
203 }
204
dispatchDidCancelAuthenticationChallenge(DocumentLoader *,unsigned long identifier,const AuthenticationChallenge &)205 void FrameLoaderClientEfl::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&)
206 {
207 notImplemented();
208 }
209
dispatchWillSendRequest(DocumentLoader * loader,unsigned long identifier,ResourceRequest & coreRequest,const ResourceResponse & coreResponse)210 void FrameLoaderClientEfl::dispatchWillSendRequest(DocumentLoader* loader, unsigned long identifier, ResourceRequest& coreRequest, const ResourceResponse& coreResponse)
211 {
212 CString url = coreRequest.url().string().utf8();
213 DBG("Resource url=%s", url.data());
214
215 Ewk_Frame_Resource_Request request = { 0, identifier };
216 Ewk_Frame_Resource_Request orig = request; /* Initialize const fields. */
217
218 orig.url = request.url = url.data();
219
220 ewk_frame_request_will_send(m_frame, &request);
221
222 if (request.url != orig.url) {
223 coreRequest.setURL(KURL(KURL(), request.url));
224
225 // Calling client might have changed our url pointer.
226 // Free the new allocated string.
227 free(const_cast<char*>(request.url));
228 }
229 }
230
shouldUseCredentialStorage(DocumentLoader *,unsigned long)231 bool FrameLoaderClientEfl::shouldUseCredentialStorage(DocumentLoader*, unsigned long)
232 {
233 notImplemented();
234 return false;
235 }
236
assignIdentifierToInitialRequest(unsigned long identifier,DocumentLoader *,const ResourceRequest & coreRequest)237 void FrameLoaderClientEfl::assignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader*, const ResourceRequest& coreRequest)
238 {
239 CString url = coreRequest.url().string().utf8();
240 DBG("Resource url=%s", url.data());
241
242 Ewk_Frame_Resource_Request request = { 0, identifier };
243 ewk_frame_request_assign_identifier(m_frame, &request);
244 }
245
postProgressStartedNotification()246 void FrameLoaderClientEfl::postProgressStartedNotification()
247 {
248 ewk_frame_load_started(m_frame);
249 postProgressEstimateChangedNotification();
250 }
251
postProgressEstimateChangedNotification()252 void FrameLoaderClientEfl::postProgressEstimateChangedNotification()
253 {
254 ewk_frame_load_progress_changed(m_frame);
255 }
256
postProgressFinishedNotification()257 void FrameLoaderClientEfl::postProgressFinishedNotification()
258 {
259 if (m_loadError.isNull())
260 ewk_frame_load_finished(m_frame, 0, 0, 0, 0, 0);
261 else {
262 ewk_frame_load_finished(m_frame,
263 m_loadError.domain().utf8().data(),
264 m_loadError.errorCode(),
265 m_loadError.isCancellation(),
266 m_loadError.localizedDescription().utf8().data(),
267 m_loadError.failingURL().utf8().data());
268 }
269 }
270
frameLoaderDestroyed()271 void FrameLoaderClientEfl::frameLoaderDestroyed()
272 {
273 if (m_frame)
274 ewk_frame_core_gone(m_frame);
275 m_frame = 0;
276
277 delete this;
278 }
279
dispatchDidReceiveResponse(DocumentLoader *,unsigned long,const ResourceResponse & response)280 void FrameLoaderClientEfl::dispatchDidReceiveResponse(DocumentLoader*, unsigned long, const ResourceResponse& response)
281 {
282 m_response = response;
283 }
284
dispatchDecidePolicyForResponse(FramePolicyFunction function,const ResourceResponse & response,const ResourceRequest &)285 void FrameLoaderClientEfl::dispatchDecidePolicyForResponse(FramePolicyFunction function, const ResourceResponse& response, const ResourceRequest&)
286 {
287 // we need to call directly here (currently callPolicyFunction does that!)
288 ASSERT(function);
289 if (canShowMIMEType(response.mimeType()))
290 callPolicyFunction(function, PolicyUse);
291 else
292 callPolicyFunction(function, PolicyDownload);
293 }
294
dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function,const NavigationAction & action,const ResourceRequest &,PassRefPtr<FormState>,const String &)295 void FrameLoaderClientEfl::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function, const NavigationAction& action, const ResourceRequest&, PassRefPtr<FormState>, const String&)
296 {
297 ASSERT(function);
298 ASSERT(m_frame);
299 // if not acceptNavigationRequest - look at Qt -> PolicyIgnore;
300 // FIXME: do proper check and only reset forms when on PolicyIgnore
301 Frame* f = ewk_frame_core_get(m_frame);
302 f->loader()->resetMultipleFormSubmissionProtection();
303 callPolicyFunction(function, PolicyUse);
304 }
305
dispatchDecidePolicyForNavigationAction(FramePolicyFunction function,const NavigationAction & action,const ResourceRequest & resourceRequest,PassRefPtr<FormState>)306 void FrameLoaderClientEfl::dispatchDecidePolicyForNavigationAction(FramePolicyFunction function, const NavigationAction& action, const ResourceRequest& resourceRequest, PassRefPtr<FormState>)
307 {
308 ASSERT(function);
309 ASSERT(m_frame);
310 // if not acceptNavigationRequest - look at Qt -> PolicyIgnore;
311 // FIXME: do proper check and only reset forms when on PolicyIgnore
312 char* url = strdup(resourceRequest.url().string().utf8().data());
313 Ewk_Frame_Resource_Request request = { url, 0 };
314 Eina_Bool ret = ewk_view_navigation_policy_decision(m_view, &request);
315 free(url);
316
317 PolicyAction policy;
318 if (!ret)
319 policy = PolicyIgnore;
320 else {
321 if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted) {
322 Frame* f = ewk_frame_core_get(m_frame);
323 f->loader()->resetMultipleFormSubmissionProtection();
324 }
325 policy = PolicyUse;
326 }
327 callPolicyFunction(function, policy);
328 }
329
createPlugin(const IntSize & pluginSize,HTMLPlugInElement * element,const KURL & url,const Vector<String> & paramNames,const Vector<String> & paramValues,const String & mimeType,bool loadManually)330 PassRefPtr<Widget> FrameLoaderClientEfl::createPlugin(const IntSize& pluginSize, HTMLPlugInElement* element, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually)
331 {
332 ASSERT(m_frame);
333 ASSERT(m_view);
334
335 return ewk_view_plugin_create(m_view, m_frame, pluginSize,
336 element, url, paramNames, paramValues,
337 mimeType, loadManually);
338 }
339
createFrame(const KURL & url,const String & name,HTMLFrameOwnerElement * ownerElement,const String & referrer,bool allowsScrolling,int marginWidth,int marginHeight)340 PassRefPtr<Frame> FrameLoaderClientEfl::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement, const String& referrer, bool allowsScrolling, int marginWidth, int marginHeight)
341 {
342 ASSERT(m_frame);
343 ASSERT(m_view);
344
345 return ewk_view_frame_create(m_view, m_frame, name, ownerElement, url, referrer);
346 }
347
didTransferChildFrameToNewDocument(Page *)348 void FrameLoaderClientEfl::didTransferChildFrameToNewDocument(Page*)
349 {
350 }
351
transferLoadingResourceFromPage(unsigned long,DocumentLoader *,const ResourceRequest &,Page *)352 void FrameLoaderClientEfl::transferLoadingResourceFromPage(unsigned long, DocumentLoader*, const ResourceRequest&, Page*)
353 {
354 }
355
redirectDataToPlugin(Widget * pluginWidget)356 void FrameLoaderClientEfl::redirectDataToPlugin(Widget* pluginWidget)
357 {
358 ASSERT(!m_pluginView);
359 m_pluginView = static_cast<PluginView*>(pluginWidget);
360 m_hasSentResponseToPlugin = false;
361 }
362
createJavaAppletWidget(const IntSize &,HTMLAppletElement *,const KURL & baseURL,const Vector<String> & paramNames,const Vector<String> & paramValues)363 PassRefPtr<Widget> FrameLoaderClientEfl::createJavaAppletWidget(const IntSize&, HTMLAppletElement*, const KURL& baseURL,
364 const Vector<String>& paramNames, const Vector<String>& paramValues)
365 {
366 notImplemented();
367 return 0;
368 }
369
objectContentType(const KURL & url,const String & mimeType,bool shouldPreferPlugInsForImages)370 ObjectContentType FrameLoaderClientEfl::objectContentType(const KURL& url, const String& mimeType, bool shouldPreferPlugInsForImages)
371 {
372 // FIXME: once plugin support is enabled, this method needs to correctly handle the 'shouldPreferPlugInsForImages' flag. See
373 // WebCore::FrameLoader::defaultObjectContentType() for an example.
374 UNUSED_PARAM(shouldPreferPlugInsForImages);
375
376 if (url.isEmpty() && mimeType.isEmpty())
377 return ObjectContentNone;
378
379 // We don't use MIMETypeRegistry::getMIMETypeForPath() because it returns "application/octet-stream" upon failure
380 String type = mimeType;
381 if (type.isEmpty())
382 type = MIMETypeRegistry::getMIMETypeForExtension(url.path().substring(url.path().reverseFind('.') + 1));
383
384 if (type.isEmpty())
385 return ObjectContentFrame;
386
387 if (MIMETypeRegistry::isSupportedImageMIMEType(type))
388 return ObjectContentImage;
389
390 #if 0 // PluginDatabase is disabled until we have Plugin system done.
391 if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType))
392 return ObjectContentNetscapePlugin;
393 #endif
394
395 if (MIMETypeRegistry::isSupportedNonImageMIMEType(type))
396 return ObjectContentFrame;
397
398 if (url.protocol() == "about")
399 return ObjectContentFrame;
400
401 return ObjectContentNone;
402 }
403
overrideMediaType() const404 String FrameLoaderClientEfl::overrideMediaType() const
405 {
406 notImplemented();
407 return String();
408 }
409
windowObjectCleared()410 void FrameLoaderClientEfl::windowObjectCleared()
411 {
412 notImplemented();
413 }
414
documentElementAvailable()415 void FrameLoaderClientEfl::documentElementAvailable()
416 {
417 return;
418 }
419
didPerformFirstNavigation() const420 void FrameLoaderClientEfl::didPerformFirstNavigation() const
421 {
422 ewk_frame_did_perform_first_navigation(m_frame);
423 }
424
registerForIconNotification(bool)425 void FrameLoaderClientEfl::registerForIconNotification(bool)
426 {
427 notImplemented();
428 }
429
setMainFrameDocumentReady(bool)430 void FrameLoaderClientEfl::setMainFrameDocumentReady(bool)
431 {
432 // this is only interesting once we provide an external API for the DOM
433 }
434
hasWebView() const435 bool FrameLoaderClientEfl::hasWebView() const
436 {
437 // notImplemented();
438 return true;
439 }
440
hasFrameView() const441 bool FrameLoaderClientEfl::hasFrameView() const
442 {
443 notImplemented();
444 return true;
445 }
446
dispatchDidFinishLoad()447 void FrameLoaderClientEfl::dispatchDidFinishLoad()
448 {
449 m_loadError = ResourceError(); /* clears previous error */
450 }
451
frameLoadCompleted()452 void FrameLoaderClientEfl::frameLoadCompleted()
453 {
454 // Note: Can be called multiple times.
455 }
456
saveViewStateToItem(HistoryItem * item)457 void FrameLoaderClientEfl::saveViewStateToItem(HistoryItem* item)
458 {
459 ewk_frame_view_state_save(m_frame, item);
460 }
461
restoreViewState()462 void FrameLoaderClientEfl::restoreViewState()
463 {
464 ASSERT(m_frame);
465 ASSERT(m_view);
466
467 ewk_view_restore_state(m_view, m_frame);
468 }
469
updateGlobalHistoryRedirectLinks()470 void FrameLoaderClientEfl::updateGlobalHistoryRedirectLinks()
471 {
472 }
473
shouldGoToHistoryItem(HistoryItem * item) const474 bool FrameLoaderClientEfl::shouldGoToHistoryItem(HistoryItem* item) const
475 {
476 // FIXME: This is a very simple implementation. More sophisticated
477 // implementation would delegate the decision to a PolicyDelegate.
478 // See mac implementation for example.
479 return item;
480 }
481
shouldStopLoadingForHistoryItem(HistoryItem * item) const482 bool FrameLoaderClientEfl::shouldStopLoadingForHistoryItem(HistoryItem* item) const
483 {
484 return true;
485 }
486
didDisplayInsecureContent()487 void FrameLoaderClientEfl::didDisplayInsecureContent()
488 {
489 notImplemented();
490 }
491
didRunInsecureContent(SecurityOrigin *,const KURL &)492 void FrameLoaderClientEfl::didRunInsecureContent(SecurityOrigin*, const KURL&)
493 {
494 notImplemented();
495 }
496
makeRepresentation(DocumentLoader *)497 void FrameLoaderClientEfl::makeRepresentation(DocumentLoader*)
498 {
499 notImplemented();
500 }
501
forceLayout()502 void FrameLoaderClientEfl::forceLayout()
503 {
504 ewk_frame_force_layout(m_frame);
505 }
506
forceLayoutForNonHTML()507 void FrameLoaderClientEfl::forceLayoutForNonHTML()
508 {
509 }
510
setCopiesOnScroll()511 void FrameLoaderClientEfl::setCopiesOnScroll()
512 {
513 // apparently mac specific (Qt comment)
514 }
515
detachedFromParent2()516 void FrameLoaderClientEfl::detachedFromParent2()
517 {
518 }
519
detachedFromParent3()520 void FrameLoaderClientEfl::detachedFromParent3()
521 {
522 }
523
loadedFromCachedPage()524 void FrameLoaderClientEfl::loadedFromCachedPage()
525 {
526 notImplemented();
527 }
528
dispatchDidHandleOnloadEvents()529 void FrameLoaderClientEfl::dispatchDidHandleOnloadEvents()
530 {
531 notImplemented();
532 }
533
dispatchDidReceiveServerRedirectForProvisionalLoad()534 void FrameLoaderClientEfl::dispatchDidReceiveServerRedirectForProvisionalLoad()
535 {
536 notImplemented();
537 }
538
dispatchDidCancelClientRedirect()539 void FrameLoaderClientEfl::dispatchDidCancelClientRedirect()
540 {
541 notImplemented();
542 }
543
dispatchWillPerformClientRedirect(const KURL &,double,double)544 void FrameLoaderClientEfl::dispatchWillPerformClientRedirect(const KURL&, double, double)
545 {
546 notImplemented();
547 }
548
dispatchDidChangeLocationWithinPage()549 void FrameLoaderClientEfl::dispatchDidChangeLocationWithinPage()
550 {
551 ewk_frame_uri_changed(m_frame);
552
553 if (ewk_view_frame_main_get(m_view) != m_frame)
554 return;
555 ewk_view_uri_changed(m_view);
556 }
557
dispatchWillClose()558 void FrameLoaderClientEfl::dispatchWillClose()
559 {
560 notImplemented();
561 }
562
dispatchDidReceiveIcon()563 void FrameLoaderClientEfl::dispatchDidReceiveIcon()
564 {
565 /* report received favicon only for main frame. */
566 if (ewk_view_frame_main_get(m_view) != m_frame)
567 return;
568
569 ewk_view_frame_main_icon_received(m_view);
570 }
571
dispatchDidStartProvisionalLoad()572 void FrameLoaderClientEfl::dispatchDidStartProvisionalLoad()
573 {
574 ewk_frame_load_provisional(m_frame);
575 if (ewk_view_frame_main_get(m_view) == m_frame)
576 ewk_view_load_provisional(m_view);
577 }
578
dispatchDidReceiveTitle(const StringWithDirection & title)579 void FrameLoaderClientEfl::dispatchDidReceiveTitle(const StringWithDirection& title)
580 {
581 // FIXME: use direction of title.
582 CString cs = title.string().utf8();
583 ewk_frame_title_set(m_frame, cs.data());
584
585 if (ewk_view_frame_main_get(m_view) != m_frame)
586 return;
587 ewk_view_title_set(m_view, cs.data());
588 }
589
dispatchDidChangeIcons()590 void FrameLoaderClientEfl::dispatchDidChangeIcons()
591 {
592 notImplemented();
593 }
594
dispatchDidCommitLoad()595 void FrameLoaderClientEfl::dispatchDidCommitLoad()
596 {
597 ewk_frame_uri_changed(m_frame);
598 if (ewk_view_frame_main_get(m_view) != m_frame)
599 return;
600 ewk_view_title_set(m_view, 0);
601 ewk_view_uri_changed(m_view);
602 }
603
dispatchDidFinishDocumentLoad()604 void FrameLoaderClientEfl::dispatchDidFinishDocumentLoad()
605 {
606 ewk_frame_load_document_finished(m_frame);
607 }
608
dispatchDidFirstLayout()609 void FrameLoaderClientEfl::dispatchDidFirstLayout()
610 {
611 ewk_frame_load_firstlayout_finished(m_frame);
612 }
613
dispatchDidFirstVisuallyNonEmptyLayout()614 void FrameLoaderClientEfl::dispatchDidFirstVisuallyNonEmptyLayout()
615 {
616 ewk_frame_load_firstlayout_nonempty_finished(m_frame);
617 }
618
dispatchShow()619 void FrameLoaderClientEfl::dispatchShow()
620 {
621 ewk_view_load_show(m_view);
622 }
623
cancelPolicyCheck()624 void FrameLoaderClientEfl::cancelPolicyCheck()
625 {
626 notImplemented();
627 }
628
dispatchDidLoadMainResource(DocumentLoader *)629 void FrameLoaderClientEfl::dispatchDidLoadMainResource(DocumentLoader*)
630 {
631 notImplemented();
632 }
633
revertToProvisionalState(DocumentLoader *)634 void FrameLoaderClientEfl::revertToProvisionalState(DocumentLoader*)
635 {
636 notImplemented();
637 }
638
willChangeTitle(DocumentLoader *)639 void FrameLoaderClientEfl::willChangeTitle(DocumentLoader*)
640 {
641 // no need for, dispatchDidReceiveTitle is the right callback
642 }
643
didChangeTitle(DocumentLoader * l)644 void FrameLoaderClientEfl::didChangeTitle(DocumentLoader *l)
645 {
646 // no need for, dispatchDidReceiveTitle is the right callback
647 }
648
canHandleRequest(const ResourceRequest &) const649 bool FrameLoaderClientEfl::canHandleRequest(const ResourceRequest&) const
650 {
651 notImplemented();
652 return true;
653 }
654
canShowMIMETypeAsHTML(const String & MIMEType) const655 bool FrameLoaderClientEfl::canShowMIMETypeAsHTML(const String& MIMEType) const
656 {
657 notImplemented();
658 return false;
659 }
660
canShowMIMEType(const String & MIMEType) const661 bool FrameLoaderClientEfl::canShowMIMEType(const String& MIMEType) const
662 {
663 if (MIMETypeRegistry::isSupportedImageMIMEType(MIMEType))
664 return true;
665
666 if (MIMETypeRegistry::isSupportedNonImageMIMEType(MIMEType))
667 return true;
668
669 #if 0 // PluginDatabase is disabled until we have Plugin system done.
670 if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(MIMEType))
671 return true;
672 #endif
673
674 return false;
675 }
676
representationExistsForURLScheme(const String &) const677 bool FrameLoaderClientEfl::representationExistsForURLScheme(const String&) const
678 {
679 return false;
680 }
681
generatedMIMETypeForURLScheme(const String &) const682 String FrameLoaderClientEfl::generatedMIMETypeForURLScheme(const String&) const
683 {
684 notImplemented();
685 return String();
686 }
687
finishedLoading(DocumentLoader * loader)688 void FrameLoaderClientEfl::finishedLoading(DocumentLoader* loader)
689 {
690 if (!m_pluginView)
691 return;
692 m_pluginView->didFinishLoading();
693 m_pluginView = 0;
694 m_hasSentResponseToPlugin = false;
695 }
696
697
provisionalLoadStarted()698 void FrameLoaderClientEfl::provisionalLoadStarted()
699 {
700 notImplemented();
701 }
702
didFinishLoad()703 void FrameLoaderClientEfl::didFinishLoad()
704 {
705 notImplemented();
706 }
707
prepareForDataSourceReplacement()708 void FrameLoaderClientEfl::prepareForDataSourceReplacement()
709 {
710 notImplemented();
711 }
712
setTitle(const StringWithDirection & title,const KURL & url)713 void FrameLoaderClientEfl::setTitle(const StringWithDirection& title, const KURL& url)
714 {
715 // no need for, dispatchDidReceiveTitle is the right callback
716 }
717
dispatchDidReceiveContentLength(DocumentLoader *,unsigned long identifier,int dataLength)718 void FrameLoaderClientEfl::dispatchDidReceiveContentLength(DocumentLoader*, unsigned long identifier, int dataLength)
719 {
720 notImplemented();
721 }
722
dispatchDidFinishLoading(DocumentLoader *,unsigned long identifier)723 void FrameLoaderClientEfl::dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier)
724 {
725 notImplemented();
726 }
727
dispatchDidFailLoading(DocumentLoader * loader,unsigned long identifier,const ResourceError & err)728 void FrameLoaderClientEfl::dispatchDidFailLoading(DocumentLoader* loader, unsigned long identifier, const ResourceError& err)
729 {
730 notImplemented();
731 }
732
dispatchDidLoadResourceFromMemoryCache(DocumentLoader *,const ResourceRequest &,const ResourceResponse &,int length)733 bool FrameLoaderClientEfl::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*, const ResourceRequest&, const ResourceResponse&, int length)
734 {
735 notImplemented();
736 return false;
737 }
738
dispatchDidLoadResourceByXMLHttpRequest(unsigned long,const String &)739 void FrameLoaderClientEfl::dispatchDidLoadResourceByXMLHttpRequest(unsigned long, const String&)
740 {
741 notImplemented();
742 }
743
dispatchDidFailProvisionalLoad(const ResourceError & err)744 void FrameLoaderClientEfl::dispatchDidFailProvisionalLoad(const ResourceError& err)
745 {
746 dispatchDidFailLoad(err);
747 }
748
dispatchDidFailLoad(const ResourceError & err)749 void FrameLoaderClientEfl::dispatchDidFailLoad(const ResourceError& err)
750 {
751 if (!shouldFallBack(err))
752 return;
753
754 m_loadError = err;
755 ewk_frame_load_error(m_frame,
756 m_loadError.domain().utf8().data(),
757 m_loadError.errorCode(), m_loadError.isCancellation(),
758 m_loadError.localizedDescription().utf8().data(),
759 m_loadError.failingURL().utf8().data());
760 }
761
download(ResourceHandle *,const ResourceRequest & request,const ResourceRequest &,const ResourceResponse &)762 void FrameLoaderClientEfl::download(ResourceHandle*, const ResourceRequest& request, const ResourceRequest&, const ResourceResponse&)
763 {
764 if (!m_view)
765 return;
766
767 CString url = request.url().string().utf8();
768 Ewk_Download download;
769
770 download.url = url.data();
771 ewk_view_download_request(m_view, &download);
772 }
773
774 // copied from WebKit/Misc/WebKitErrors[Private].h
775 enum {
776 WebKitErrorCannotShowMIMEType = 100,
777 WebKitErrorCannotShowURL = 101,
778 WebKitErrorFrameLoadInterruptedByPolicyChange = 102,
779 WebKitErrorCannotUseRestrictedPort = 103,
780 WebKitErrorCannotFindPlugIn = 200,
781 WebKitErrorCannotLoadPlugIn = 201,
782 WebKitErrorJavaUnavailable = 202,
783 };
784
cancelledError(const ResourceRequest & request)785 ResourceError FrameLoaderClientEfl::cancelledError(const ResourceRequest& request)
786 {
787 ResourceError error("Error", -999, request.url().string(),
788 "Request cancelled");
789 error.setIsCancellation(true);
790 return error;
791 }
792
blockedError(const ResourceRequest & request)793 ResourceError FrameLoaderClientEfl::blockedError(const ResourceRequest& request)
794 {
795 return ResourceError("Error", WebKitErrorCannotUseRestrictedPort, request.url().string(),
796 "Request blocked");
797 }
798
cannotShowURLError(const ResourceRequest & request)799 ResourceError FrameLoaderClientEfl::cannotShowURLError(const ResourceRequest& request)
800 {
801 return ResourceError("Error", WebKitErrorCannotShowURL, request.url().string(),
802 "Cannot show URL");
803 }
804
interruptForPolicyChangeError(const ResourceRequest & request)805 ResourceError FrameLoaderClientEfl::interruptForPolicyChangeError(const ResourceRequest& request)
806 {
807 return ResourceError("Error", WebKitErrorFrameLoadInterruptedByPolicyChange,
808 request.url().string(), "Frame load interrupted by policy change");
809 }
810
cannotShowMIMETypeError(const ResourceResponse & response)811 ResourceError FrameLoaderClientEfl::cannotShowMIMETypeError(const ResourceResponse& response)
812 {
813 return ResourceError("Error", WebKitErrorCannotShowMIMEType, response.url().string(),
814 "Cannot show mimetype");
815 }
816
fileDoesNotExistError(const ResourceResponse & response)817 ResourceError FrameLoaderClientEfl::fileDoesNotExistError(const ResourceResponse& response)
818 {
819 return ResourceError("Error", -998 /* ### */, response.url().string(),
820 "File does not exist");
821 }
822
pluginWillHandleLoadError(const ResourceResponse &)823 ResourceError FrameLoaderClientEfl::pluginWillHandleLoadError(const ResourceResponse&)
824 {
825 notImplemented();
826 return ResourceError("Error", 0, "", "");
827 }
828
shouldFallBack(const ResourceError & error)829 bool FrameLoaderClientEfl::shouldFallBack(const ResourceError& error)
830 {
831 return !(error.isCancellation() || (error.errorCode() == WebKitErrorFrameLoadInterruptedByPolicyChange));
832 }
833
canCachePage() const834 bool FrameLoaderClientEfl::canCachePage() const
835 {
836 return false;
837 }
838
dispatchCreatePage(const NavigationAction &)839 Frame* FrameLoaderClientEfl::dispatchCreatePage(const NavigationAction&)
840 {
841 if (!m_view)
842 return 0;
843
844 Evas_Object* newView = ewk_view_window_create(m_view, EINA_FALSE, 0);
845 Evas_Object* mainFrame;
846 if (!newView)
847 mainFrame = m_frame;
848 else
849 mainFrame = ewk_view_frame_main_get(newView);
850
851 return ewk_frame_core_get(mainFrame);
852 }
853
dispatchUnableToImplementPolicy(const ResourceError &)854 void FrameLoaderClientEfl::dispatchUnableToImplementPolicy(const ResourceError&)
855 {
856 notImplemented();
857 }
858
setMainDocumentError(DocumentLoader * loader,const ResourceError & error)859 void FrameLoaderClientEfl::setMainDocumentError(DocumentLoader* loader, const ResourceError& error)
860 {
861 if (!m_pluginView)
862 return;
863 m_pluginView->didFail(error);
864 m_pluginView = 0;
865 m_hasSentResponseToPlugin = false;
866 }
867
startDownload(const ResourceRequest &)868 void FrameLoaderClientEfl::startDownload(const ResourceRequest&)
869 {
870 notImplemented();
871 }
872
updateGlobalHistory()873 void FrameLoaderClientEfl::updateGlobalHistory()
874 {
875 notImplemented();
876 }
877
savePlatformDataToCachedFrame(CachedFrame *)878 void FrameLoaderClientEfl::savePlatformDataToCachedFrame(CachedFrame*)
879 {
880 notImplemented();
881 }
882
transitionToCommittedFromCachedFrame(CachedFrame *)883 void FrameLoaderClientEfl::transitionToCommittedFromCachedFrame(CachedFrame*)
884 {
885 }
886
transitionToCommittedForNewPage()887 void FrameLoaderClientEfl::transitionToCommittedForNewPage()
888 {
889 ASSERT(m_frame);
890 ASSERT(m_view);
891
892 ewk_frame_view_create_for_view(m_frame, m_view);
893
894 if (m_frame == ewk_view_frame_main_get(m_view))
895 ewk_view_frame_main_cleared(m_view);
896 }
897
didSaveToPageCache()898 void FrameLoaderClientEfl::didSaveToPageCache()
899 {
900 }
901
didRestoreFromPageCache()902 void FrameLoaderClientEfl::didRestoreFromPageCache()
903 {
904 }
905
dispatchDidBecomeFrameset(bool)906 void FrameLoaderClientEfl::dispatchDidBecomeFrameset(bool)
907 {
908 }
909
createNetworkingContext()910 PassRefPtr<FrameNetworkingContext> FrameLoaderClientEfl::createNetworkingContext()
911 {
912 return FrameNetworkingContextEfl::create(ewk_frame_core_get(m_frame));
913 }
914
915 }
916