fix crash issue
[framework/osp/web.git] / src / controls / FWebCtrl_WebImpl.h
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file                FWebCtrl_WebImpl.h
20  * @brief               The file contains the declaration of _WebImpl class.
21  *
22  * The file contains the declaration of _WebImpl class.
23  */
24 #ifndef _FWEB_CTRL_INTERNAL_WEB_IMPL_H_
25 #define _FWEB_CTRL_INTERNAL_WEB_IMPL_H_
26
27 #include <unique_ptr.h>
28 #include <EWebKit2.h>
29 #include <FBaseColArrayList.h>
30 #include <FBaseString.h>
31 #include <FUiIActionEventListener.h>
32 #include <FUiIOrientationEventListener.h>
33 #include <FUiITextEventListener.h>
34 #include <FWebCtrlILoadingListener.h>
35 #include <FUi_ContainerImpl.h>
36 #include "FWebCtrl_IWebEventListener.h"
37 #include "FWebCtrl_UserConfirmPopup.h"
38 #include "FWebCtrl_CertificateConfirmPopup.h"
39
40 namespace Tizen { namespace Base {  namespace Collection
41 {
42 template< class KeyType, class ValueType > class HashMapT;
43 }}} // Tizen::Base::Collection
44
45 namespace Tizen { namespace Base { namespace Runtime
46 {
47 class Mutex;
48 }}} // Tizen::Base::Runtime
49
50 namespace Tizen { namespace Graphics
51 {
52 class Dimension;
53 class Point;
54 class Rectangle;
55 }} // Tizen::Graphics
56
57 namespace Tizen { namespace Net { namespace Http {
58 class HttpHeader;
59 }}} // Tizen::Net::Http
60
61 namespace Tizen { namespace Sytem
62 {
63 class _VibratorImpl;
64 }} // Tizen::Sytem
65
66 namespace Tizen { namespace Ui
67 {
68 class Contorl;
69 class _Contorl;
70 class _ContorlImpl;
71 }} // Tizen::Ui
72
73 namespace Tizen { namespace Ui {  namespace Controls
74 {
75 class Keypad;
76 class _Form;
77 }}} // Tizen::Ui::Controls
78
79 namespace Tizen { namespace Web { namespace Json
80 {
81 class IJsonValue;
82 }}} // Tizen::Web::Json
83
84 namespace Tizen { namespace Web { namespace Controls
85 {
86 class IJavaScriptBridge;
87 class ILoadingListener;
88 class ITextSearchListener;
89 class IWebDownloadListener;
90 class IWebKeypadEventListener;
91 class IWebUiEventListener;
92 class IWebUiEventListenerF;
93 class AuthenticationChallenge;
94 class HitElementResult;
95 class PageNavigationList;
96 class Web;
97 class WebSetting;
98 class _Web;
99 class _JsBridgeArg;
100 class _WebEvent;
101 class _WebPresenter;
102 class _JsBridgeComparer;
103 class _JsBridgeHashCodeProvider;
104 class _AuthConfirmPopup;
105 class _GeolocationConfirmPopup;
106 class _PromptPopup;
107 class _WebDataHandler;
108 class _SelectBox;
109 class _InputPickerPopup;
110
111 struct _TextSearch
112 {
113         bool __searchAll;
114         bool __searchForward;
115         bool __caseSensitive;
116         int __pending;
117         int __currentIndex;
118         int __totalCount;
119         Tizen::Base::String __text;
120         Tizen::Base::Collection::Queue __searchQueue;
121 };
122
123 enum _SearchType {
124         SEARCH_SYNC,
125         SEARCH_ALL_ASYNC,
126         SEARCH_NEXT_ASYNC
127 };
128
129 class _WebImpl
130         : public Tizen::Ui::_ContainerImpl
131         , public Tizen::Ui::ITextEventListener
132         , public Tizen::Web::Controls::_IWebEventListener
133 {
134 public:
135         _WebImpl(Web* pWeb, Tizen::Ui::_Control* pCore);
136
137         virtual ~_WebImpl(void);
138
139         result Construct(void);
140
141         bool HasValidNativeNode(void) const;
142
143         result SetZoomLevel(float level);
144
145         float GetZoomLevel(void) const;
146
147         result LoadUrl(const Tizen::Base::String& url) const;
148
149         result LoadUrl(const Tizen::Base::String& url, const Tizen::Net::Http::HttpHeader& header);
150
151         result LoadUrlWithPostRequest(const Tizen::Base::String& url, const Tizen::Net::Http::HttpHeader& header, const Tizen::Base::ByteBuffer& body) const;
152
153         result LoadData(const Tizen::Base::String& baseUrl, const Tizen::Base::ByteBuffer& content, const Tizen::Base::String& mime, const Tizen::Base::String& encoding) const;
154
155         bool CanGoBack(void) const;
156
157         bool CanGoForward(void) const;
158
159         void GoBack(void) const;
160
161         void GoForward(void) const;
162
163         bool IsLoading(void) const;
164
165         void StopLoading(void) const;
166
167         void Reload(void) const;
168
169         result AddCustomHeader(const Tizen::Net::Http::HttpHeader& header);
170
171         void RemoveAllCustomHeaders(void);
172
173         bool SearchText(const Tizen::Base::String& word, bool searchForward);
174
175         result SetSetting(const Tizen::Web::Controls::WebSetting& setting);
176
177         Tizen::Web::Controls::WebSetting GetSetting(void) const;
178
179         Tizen::Base::String GetUrl(void) const;
180
181         Tizen::Base::String GetTitle(void) const;
182
183         result SetBlockSelectionPosition(const Tizen::Graphics::Point& startPoint);
184
185         result SetBlockSelectionPosition(const Tizen::Graphics::FloatPoint& startPoint);
186
187         void ReleaseBlock(void);
188
189         void  GetBlockRange(Tizen::Graphics::Point& startPoint, Tizen::Graphics::Point& endPoint) const;
190
191         void  GetBlockRange(Tizen::Graphics::FloatPoint& startPoint, Tizen::Graphics::FloatPoint& endPoint) const;
192
193         Tizen::Base::String GetTextFromBlock(void) const;
194
195         Tizen::Base::String* EvaluateJavascriptN(const Tizen::Base::String& scriptCode);
196
197         bool IsPrivateBrowsingEnabled(void) const;
198
199         void SetPrivateBrowsingEnabled(bool enable);
200
201         void ClearHistory(void);
202
203         void ClearCache(void);
204
205         void ClearCookie(void);
206
207         void ClearFormData(void);
208
209         void ClearLoginFormData(void);
210
211         bool IsCookieEnabled(void) const;
212
213         void SetCookieEnabled(bool enable);
214
215         result SavePageAsPdf(const Tizen::Base::String& filePath, const Tizen::Graphics::Dimension* pSize) const;
216
217         bool IsMimeSupported(const Tizen::Base::String& mime) const;
218
219         result SearchTextAllAsync(const Tizen::Base::String& text, bool caseSensitive);
220
221         result SearchNextAsync(bool searchForward);
222
223         result SynchronizeSearch(_SearchType type, Evas_Object* pView, Ewk_Find_Options condition, const Tizen::Base::String& text
224                 , bool searchForward, bool caseSensitive = false,  _WebPresenter* pWebPresenter = null);
225
226         void SetAsyncSearchResult(int totalCount);
227
228         _WebPresenter* GetSearchPresenter(void);
229
230          int GetPendingAsyncSearchCount(void) const;
231
232         void CalculateAsyncSearchOrdinal(void);
233
234         int GetAsyncSearchOrdinal(void) const;
235
236         void DisableAsyncSearch(void);
237
238         void SetTextSearchListener(Tizen::Web::Controls::ITextSearchListener* pTextSearchListener);
239
240         void SetLoadingListener(Tizen::Web::Controls::ILoadingListener* pLoadingListener);
241
242         void SetWebUiEventListener(Tizen::Web::Controls::IWebUiEventListener* pUiEventListener);
243
244         void SetWebUiEventListenerF(Tizen::Web::Controls::IWebUiEventListenerF* pUiEventListener);
245
246         void SetWebKeypadEventListener(IWebKeypadEventListener* pKeypadEventListener);
247
248         void SetDownloadListener(Tizen::Web::Controls::IWebDownloadListener* pDownLoadListener);
249
250         Tizen::Web::Controls::ILoadingListener* GetLoadingListener(void) const;
251
252         Tizen::Web::Controls::IWebUiEventListener* GetUiEventListener(void) const;
253
254         Tizen::Web::Controls::IWebUiEventListenerF* GetUiEventListenerF(void) const;
255
256         Tizen::Web::Controls::ITextSearchListener* GetTextSearchListener(void) const;
257
258         Tizen::Web::Controls::IWebKeypadEventListener* GetWebKeypadEventListener(void) const;
259
260         const Tizen::Web::Controls::PageNavigationList* GetBackForwardListN(void) const;
261
262         const Tizen::Web::Controls::HitElementResult* GetElementByPointN(const Tizen::Graphics::Point& point) const;
263
264         const Tizen::Web::Controls::HitElementResult* GetElementByPointN(const Tizen::Graphics::FloatPoint& point) const;
265
266         result AddJavaScriptBridge(const IJavaScriptBridge& jsBridge);
267
268         result RemoveJavaScriptBridge(const IJavaScriptBridge& jsBridge);
269
270         void SetScrollEnabled(bool enable);
271
272         bool IsScrollEnabled(void) const;
273
274         Tizen::Graphics::Bitmap* GetFaviconN(void) const;
275
276         void Pause(void);
277
278         void Resume(void);
279
280         void ScrollBy(const Tizen::Graphics::Point& diff);
281
282         void ScrollTo(const Tizen::Graphics::Point& dest);
283
284         Tizen::Graphics::Point GetScrollPosition(void) const;
285
286         Tizen::Graphics::Dimension GetPageSize(void) const;
287
288         virtual bool IsLayoutable(void) const;
289
290         void SetEventListenerCallback(void) const;
291
292         void RemoveEventListenerCallback(void) const;
293
294         _WebEvent* GetWebEvent(void) const;
295
296         _WebDataHandler* GetDownloadHandler(void) const;
297
298         result SetFullScreenKeypad(void);
299
300         void RemoveFullScreenKeypad(void);
301
302         void SetCurrentEvent(Tizen::Base::Runtime::IEventArg* arg);
303
304         void SetLoadingErrorOccurred(bool arg);
305
306         bool IsLoadingErrorOccurred(void) const;
307
308         void SetRedirectRequested(bool arg);
309
310         bool IsRedirectRequested(void) const;
311
312         void SetCertificateRequested(bool arg);
313         bool IsCertificateRequested(void) const;
314         bool IsCertificateConfirmed(void) const;
315
316         void SetOrientationChanged(bool arg);
317         bool IsOrientationChanged(void) const;
318
319         result VibrationRequested(uint64_t duration);
320         void VibrationCanceled(void);
321
322         bool IsFooterVisible(void) const;
323
324         void SetFooterVisibleState(bool isFooterVisible);
325
326         bool IsKeypadVisible(void) const;
327
328         void SetKeypadVisibleState(bool isKeypadVisible);
329
330         bool IsKeypadOpened(void) const;
331
332         void SetKeypadOpened(bool isKeypadOpened);
333
334         bool IsPresenterAlived(_WebPresenter* pPresenter) const;
335         Tizen::Graphics::Rectangle GetPreviousKeypadBounds(void) const;
336
337         void SetPreviousKeypadBounds(Tizen::Graphics::Rectangle& bounds);
338
339         result HttpAuthenticationRequested(Ewk_Auth_Challenge* pChallenge);
340
341         result ShowCertificateConfirmPopup(_CertificatePopupMode userConfirmMode, Ewk_Certificate_Policy_Decision *pPolicy);
342
343         result ShowUserConfirmPopup(_UserConfirmMode userConfirmMode, void* pPolicy);
344         result ShowUserConfirmPopupAsync(_UserConfirmMode userConfirmMode, void* pPolicy, Tizen::Base::String msg = L"");
345
346         Tizen::Ui::Controls::_Form* GetParentFormCore(Tizen::Ui::_Control* pControlCore);
347
348         result ShowSelectBoxPopup(bool isMultiSelect, const Tizen::Base::String& title, Eina_List* pItems, Evas_Object* pWebView, int selectedIndex);
349         result UpdateSelectBoxPopup(Eina_List* pItems, int selectedIndex, bool isGroupedList);
350         result ClearSelectBoxPopup(void);
351
352         result ShowColorPicker(int r, int g, int b, int a,Tizen::Graphics::Color& color);
353         Eina_Bool HideColorPicker(void);
354         _InputPickerPopup* GetColorpicker(void);
355
356         result ShowDatePicker(Ewk_Input_Type inputType, const char* inputValue,Tizen::Base::String& dateStr);
357         _InputPickerPopup* GetDatepicker(void);
358
359
360         void SetPolicyDecision(DecisionPolicy policy);
361
362         DecisionPolicy GetPolicyDecision(void) const;
363
364         virtual bool OnFocusGained(const Tizen::Ui::_ControlImpl& source);
365
366         virtual bool OnFocusLost(const Tizen::Ui::_ControlImpl& source);
367
368         virtual void OnTextValueChangeCanceled(const Tizen::Ui::Control& source);
369
370         virtual void OnTextValueChanged(const Tizen::Ui::Control& source);
371
372         virtual result OnPreAttachedToMainTree(void);
373
374         virtual void OnChangeLayout(Tizen::Ui::_ControlOrientation orientation);
375
376         virtual void OnAncestorVisibleStateChanged(const Tizen::Ui::_Control& control);
377
378         static _WebImpl* CreateWebImplN(Web* pControl, const Tizen::Graphics::Rectangle& bounds);
379
380         static _WebImpl* CreateWebImplN(Web* pControl, const Tizen::Graphics::FloatRectangle& bounds);
381
382         static _WebImpl* GetInstance(Web* pWeb);
383
384         static const _WebImpl* GetInstance(const Web* pWeb);
385
386         int SearchHandler(Ewk_Custom_Handlers_Data* pHandlerData, bool checkmime);
387
388         result UnregistrationHandler(Ewk_Custom_Handlers_Data* pHandlerData, bool checkmime);
389
390         const Tizen::Base::String GetProtocolFromUri(const Tizen::Base::String& originuri, const Tizen::Base::String& currenturi);
391
392         const Tizen::Base::String GetRedirectUri(const Tizen::Base::String& originuri, const Tizen::Base::String& currenturi, const Tizen::Base::String& mime);
393
394 private:
395         result InitializeSetting(void);
396         result InitJsBridgeList(void);
397         result InitWebEvent(void);
398
399         IJavaScriptBridge* FindJsInterface(const Tizen::Web::Json::IJsonValue* pValue) const;
400         result LaunchAppControl(const Tizen::Base::Runtime::IEventArg& arg);
401
402         result ShowAuthenticationPopup(const Tizen::Base::String& host, const Tizen::Base::String& realm, AuthenticationChallenge* pAuthChallenge);
403
404         Eina_Hash* ConvertToSlpHeaderN(const Tizen::Net::Http::HttpHeader& header) const;
405
406         result OnHandleJavaScriptRequestByEventArg(const Tizen::Base::Runtime::IEventArg& arg);
407         result OnHandleLoadingEvent(const Tizen::Base::Runtime::IEventArg& arg);
408         result OnHandleWebDownloadEvent(const Tizen::Base::Runtime::IEventArg& arg);
409         result OnHandleWebUiEvent(const Tizen::Base::Runtime::IEventArg& arg);
410         result OnHandleWebUiEventF(const Tizen::Base::Runtime::IEventArg& arg);
411         result OnHandleTextSearchEvent(const Tizen::Base::Runtime::IEventArg& arg);
412
413 private:
414         bool __isFooterVisible;
415         bool __isKeypadVisible;
416         bool __isKeypadOpened;
417         bool __isLoadingErrorOccurred;
418         bool __isRedirectRequested;
419         bool __isCertificateRequested;
420         bool __isCertificateConfirmed;
421         bool __isOrientationChanged;
422         Tizen::Graphics::Rectangle __keypadBounds;
423
424         _Web* __pWebCore;
425
426         ILoadingListener* __pUserLoadingListener;
427         IWebUiEventListener* __pUserUiListener;
428         IWebUiEventListenerF* __pUserUiListenerF;
429         IWebKeypadEventListener* __pUserKeypadEventListener;
430         ITextSearchListener* __pTextSearchListener;
431
432         std::unique_ptr<Tizen::Ui::Controls::Keypad> __pKeypad;
433
434         std::unique_ptr<Tizen::Base::Collection::HashMapT< Tizen::Base::String, IJavaScriptBridge* > > __pJsBridgeList;
435         std::unique_ptr<_JsBridgeHashCodeProvider> __pJsProvider;
436         std::unique_ptr<_JsBridgeComparer> __pJsComparer;
437
438         std::unique_ptr<_WebDataHandler> __pWebDownloadHandler;
439
440         std::unique_ptr<_WebEvent> __pWebEvent;
441
442         std::unique_ptr<AuthenticationChallenge> __pAuthChallenge;
443         std::unique_ptr<_AuthConfirmPopup> __pAuthPopup;
444
445         std::unique_ptr<_UserConfirmPopup> __pUserConfirmPopup;
446
447         std::unique_ptr<_CertificateConfirmPopup>  __pCertConfirmPopup;
448
449         std::unique_ptr<_SelectBox> __pSelectBox;
450         std::unique_ptr<_InputPickerPopup> __pDatePicker;
451         std::unique_ptr<_InputPickerPopup> __pColorPicker;
452
453         std::unique_ptr<Tizen::System::_VibratorImpl> __pVibrator;
454
455         Tizen::Base::Runtime::Mutex __mutex;
456
457         _TextSearch __textSearch;
458
459         Tizen::Base::Collection::ArrayList __callbackList;
460
461         DecisionPolicy __policy;
462
463         Tizen::Base::String __defaultUserAgent;
464 }; // _WebImpl
465
466 }}} // Tizen::Web::Controls
467 #endif // _FWEB_CTRL_INTERNAL_WEB_IMPL_H_